modificados los iconos del input de b?squeda

modificado el estilo de las titled toolbars
This commit is contained in:
Luis Ángel San Martín
2013-06-15 11:35:36 +02:00
commit efd004d2dd
522 changed files with 44592 additions and 0 deletions

BIN
YACReader/YACReader.icns Normal file

Binary file not shown.

118
YACReader/YACReader.pro Normal file
View 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
View 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
View 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

View 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();
}

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

View 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);
}

View 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
View 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
View 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

View 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));
}

View 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

View 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();
}

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

1
YACReader/icon.rc Normal file
View File

@ -0,0 +1 @@
IDI_ICON1 ICON DISCARDABLE "icon.ico"

95
YACReader/images.qrc Normal file
View 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>

View 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);
}

View 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
View 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;
}

View 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();
}

View 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

View 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));
}

View 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

View 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;
}

View 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

View 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()));
}

View 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
View 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
View 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

View 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"));
}

View 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
View 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
View 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
View 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
View 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

View 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
View 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

Binary file not shown.

929
YACReader/yacreader_es.ts Normal file
View 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&apos;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&apos;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&apos;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>&amp;Open</source>
<translation>&amp;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>&amp;Previous</source>
<translation>A&amp;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>&amp;Next</source>
<translation>Siguie&amp;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>&amp;File</source>
<translation>&amp;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>&quot;Go to flow&quot; size</source>
<translation>Tamaño de &quot;Go to flow&quot;</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 &quot;Go To Flow&quot;:</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 &apos;O&apos; to open comic.</source>
<translation>Pulsa &apos;O&apos; 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
View 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&apos;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>&amp;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>&amp;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>&amp;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>&amp;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>&quot;Go to flow&quot; 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 &apos;O&apos; 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>

View 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)
{
}

View 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
View 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 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&apos;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&apos;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>&amp;Open</source>
<translation>&amp;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>&amp;Previous</source>
<translation>A&amp;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>&amp;Next</source>
<translation>&amp;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>&amp;File</source>
<translation>&amp;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> 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>&quot;Go to flow&quot; size</source>
<translation>Tamanho do &quot;Ir para cheia&quot;</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 &apos;O&apos; to open comic.</source>
<translation>Pressione &apos;O&apos; 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
View 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&apos;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>&amp;Open</source>
<translation>&amp;Открыть</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>&amp;Previous</source>
<translation>&amp;Предыдущий</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>&amp;Next</source>
<translation>&amp;Следующий</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>&amp;File</source>
<translation>&amp;Файл</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>&quot;Go to flow&quot; 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 &apos;O&apos; to open comic.</source>
<translation>Нажмите &quot;O&quot; , чтобы открыть комикс.</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>