diff options
Diffstat (limited to 'src-qt5/desktop-utils')
49 files changed, 2314 insertions, 646 deletions
diff --git a/src-qt5/desktop-utils/lumina-archiver/MainUI.cpp b/src-qt5/desktop-utils/lumina-archiver/MainUI.cpp index 47c6bfe1..3d901e8c 100644 --- a/src-qt5/desktop-utils/lumina-archiver/MainUI.cpp +++ b/src-qt5/desktop-utils/lumina-archiver/MainUI.cpp @@ -67,6 +67,8 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ ui->actionUSB_Image->setEnabled(false); loadIcons(); ui->tree_contents->setHeaderLabels( QStringList() << tr("File") << tr("MimeType") << tr("Size")+" " ); + + preservePaths = false; } MainUI::~MainUI(){ @@ -296,7 +298,7 @@ void MainUI::simpleExtractFiles(){ void MainUI::autoArchiveFiles(){ qDebug() << "Auto Archive Files:" << aaFileList; ui->label_progress->setText(tr("Adding Items...")); - BACKEND->startAdd(aaFileList); + BACKEND->startAdd(aaFileList, true); } void MainUI::extractSelection(){ diff --git a/src-qt5/desktop-utils/lumina-archiver/MainUI.h b/src-qt5/desktop-utils/lumina-archiver/MainUI.h index 1a9d287c..0a5c094c 100644 --- a/src-qt5/desktop-utils/lumina-archiver/MainUI.h +++ b/src-qt5/desktop-utils/lumina-archiver/MainUI.h @@ -26,13 +26,14 @@ public: void LoadArguments(QStringList); void loadIcons(); + bool preservePaths; private: Ui::MainUI *ui; - Backend *BACKEND; - QStringList aaFileList, sxList; - QString sxPath, sxFile; - QTimer *delayClose; + Backend *BACKEND; + QStringList aaFileList, sxList; + QString sxPath, sxFile; + QTimer *delayClose; QTreeWidgetItem* findItem(QString path, QTreeWidgetItem *start = 0); bool cleanItems(QStringList list, QTreeWidgetItem *start = 0); //returns true if anything gets cleaned diff --git a/src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp b/src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp index 5338efec..91e233d0 100644 --- a/src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp +++ b/src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp @@ -91,7 +91,7 @@ QString Backend::linkTo(QString file){ } //Modification routines -void Backend::startAdd(QStringList paths){ +void Backend::startAdd(QStringList paths, bool absolutePaths){ //if(paths.isEmpty() && !insertQueue.isEmpty()){ paths = insertQueue; } //load the queue if(paths.contains(filepath)){ paths.removeAll(filepath); } if(paths.isEmpty()){ return; } @@ -109,11 +109,12 @@ void Backend::startAdd(QStringList paths){ args << "-c" << "-a"; args << flags; //Now setup the parent dir - for(int i=0; i<paths.length(); i++){ - paths[i] = paths[i].section(parent,1,-1); - if(paths[i].startsWith("/")){ paths[i].remove(0,1); } - } - args << "-C" << parent; + if(!absolutePaths) { + for(int i=0; i<paths.length(); i++){ + paths[i] = paths[i].section(parent,1,-1); + if(paths[i].startsWith("/")){ paths[i].remove(0,1); } + } + args << "-C" << parent; } args << paths; if(QFile::exists(filepath)){ //append to existing args.replaceInStrings(filepath, tmpfilepath); diff --git a/src-qt5/desktop-utils/lumina-archiver/TarBackend.h b/src-qt5/desktop-utils/lumina-archiver/TarBackend.h index 56a7dcfe..cb24a053 100644 --- a/src-qt5/desktop-utils/lumina-archiver/TarBackend.h +++ b/src-qt5/desktop-utils/lumina-archiver/TarBackend.h @@ -33,7 +33,7 @@ public: QString linkTo(QString file); //Modification routines - void startAdd(QStringList paths); + void startAdd(QStringList paths, bool absolutePaths = false); void startRemove(QStringList paths); void startExtract(QString path, bool overwrite, QString file=""); //path to dir, overwrite, optional file to extract (everything otherwise) void startExtract(QString path, bool overwrite, QStringList files); diff --git a/src-qt5/desktop-utils/lumina-archiver/lumina-archiver.pro b/src-qt5/desktop-utils/lumina-archiver/lumina-archiver.pro index 763407b9..a1b10109 100644 --- a/src-qt5/desktop-utils/lumina-archiver/lumina-archiver.pro +++ b/src-qt5/desktop-utils/lumina-archiver/lumina-archiver.pro @@ -87,7 +87,7 @@ TRANSLATIONS = i18n/l-archiver_af.ts \ i18n/l-archiver_zu.ts dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ -dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ desktop.files=lumina-archiver.desktop desktop.path=$${L_SHAREDIR}/applications/ @@ -96,7 +96,7 @@ desktop.path=$${L_SHAREDIR}/applications/ #link.extra=ln -sf lumina-archiver $(INSTALL_ROOT)$${L_BINDIR}/lpac manpage.path=$${L_MANDIR}/man1/ -manpage.extra="$${MAN_ZIP} lumina-archiver.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-archiver.1.gz" +manpage.extra="$${MAN_ZIP} $$PWD/lumina-archiver.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-archiver.1.gz" INSTALLS += target desktop manpage diff --git a/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_da.ts b/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_da.ts index 5cdf9fa4..7ae80a69 100644 --- a/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_da.ts +++ b/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_da.ts @@ -16,7 +16,7 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> <source>Education</source> - <translation>Uddannelse</translation> + <translation>Læring</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> @@ -41,7 +41,7 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> <source>Science</source> - <translation>Videnskab</translation> + <translation>Naturvidenskab</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> @@ -56,7 +56,7 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> <source>Utility</source> - <translation>Hjælpeværktøj</translation> + <translation>Redskab</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> diff --git a/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_nl.ts b/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_nl.ts index 9947da6d..1cba660b 100644 --- a/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_nl.ts +++ b/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_nl.ts @@ -6,67 +6,67 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="608"/> <source>Multimedia</source> - <translation type="unfinished"></translation> + <translation>Multimedia</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="609"/> <source>Development</source> - <translation type="unfinished"></translation> + <translation>Ontwikkeling</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> <source>Education</source> - <translation type="unfinished"></translation> + <translation>Onderwijs</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> <source>Games</source> - <translation type="unfinished"></translation> + <translation>Spellen</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="612"/> <source>Graphics</source> - <translation type="unfinished"></translation> + <translation>Grafisch</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="613"/> <source>Network</source> - <translation type="unfinished"></translation> + <translation>Netwerk</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="614"/> <source>Office</source> - <translation type="unfinished"></translation> + <translation>Kantoor</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> <source>Science</source> - <translation type="unfinished"></translation> + <translation>Wetenschappelijk</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> <source>Settings</source> - <translation type="unfinished"></translation> + <translation>Instellingen</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="617"/> <source>System</source> - <translation type="unfinished"></translation> + <translation>Systeem</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> <source>Utility</source> - <translation type="unfinished"></translation> + <translation>Hulpmiddel</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> <source>Wine</source> - <translation type="unfinished"></translation> + <translation>Wine</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="620"/> <source>Unsorted</source> - <translation type="unfinished"></translation> + <translation>Ongesorteerd</translation> </message> </context> <context> @@ -75,22 +75,22 @@ <location filename="../mainUI.ui" line="14"/> <location filename="../mainUI.cpp" line="53"/> <source>Calculator</source> - <translation type="unfinished"></translation> + <translation>Rekenmachine</translation> </message> <message> <location filename="../mainUI.ui" line="657"/> <source>Advanced Operations</source> - <translation type="unfinished"></translation> + <translation>Geavanceerde bewerkingen</translation> </message> <message> <location filename="../mainUI.cpp" line="83"/> <source>Percentage %1</source> - <translation type="unfinished"></translation> + <translation>Percentage %1</translation> </message> <message> <location filename="../mainUI.cpp" line="85"/> <source>Power %1</source> - <translation type="unfinished"></translation> + <translation>Prestatie %1</translation> </message> <message> <location filename="../mainUI.cpp" line="87"/> diff --git a/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_pt_BR.ts b/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_pt_BR.ts index 153a01b4..e26ecb58 100644 --- a/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_pt_BR.ts +++ b/src-qt5/desktop-utils/lumina-calculator/i18n/l-calc_pt_BR.ts @@ -6,67 +6,67 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="608"/> <source>Multimedia</source> - <translation type="unfinished"></translation> + <translation>Multimídia</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="609"/> <source>Development</source> - <translation type="unfinished"></translation> + <translation>Desenvolvimento</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> <source>Education</source> - <translation type="unfinished"></translation> + <translation>Educação</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> <source>Games</source> - <translation type="unfinished"></translation> + <translation>Jogos</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="612"/> <source>Graphics</source> - <translation type="unfinished"></translation> + <translation>Gráficos</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="613"/> <source>Network</source> - <translation type="unfinished"></translation> + <translation>Rede</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="614"/> <source>Office</source> - <translation type="unfinished"></translation> + <translation>Escritório</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> <source>Science</source> - <translation type="unfinished"></translation> + <translation>Ciência</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> <source>Settings</source> - <translation type="unfinished"></translation> + <translation>Configurações</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="617"/> <source>System</source> - <translation type="unfinished"></translation> + <translation>Sistema</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> <source>Utility</source> - <translation type="unfinished"></translation> + <translation>Utilitários</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> <source>Wine</source> - <translation type="unfinished"></translation> + <translation>Wine</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="620"/> <source>Unsorted</source> - <translation type="unfinished"></translation> + <translation>Não classificado</translation> </message> </context> <context> diff --git a/src-qt5/desktop-utils/lumina-calculator/lumina-calculator.pro b/src-qt5/desktop-utils/lumina-calculator/lumina-calculator.pro index c2314545..07490634 100644 --- a/src-qt5/desktop-utils/lumina-calculator/lumina-calculator.pro +++ b/src-qt5/desktop-utils/lumina-calculator/lumina-calculator.pro @@ -84,13 +84,13 @@ TRANSLATIONS = i18n/l-calc_af.ts \ i18n/l-calc_zu.ts dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ -dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ desktop.files=lumina-calculator.desktop desktop.path=$${L_SHAREDIR}/applications/ manpage.path=$${L_MANDIR}/man1/ -manpage.extra="$${MAN_ZIP} lumina-calculator.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-calculator.1.gz" +manpage.extra="$${MAN_ZIP} $$PWD/lumina-calculator.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-calculator.1.gz" INSTALLS += target desktop manpage diff --git a/src-qt5/desktop-utils/lumina-fileinfo/lumina-fileinfo.pro b/src-qt5/desktop-utils/lumina-fileinfo/lumina-fileinfo.pro index 8a850a1c..dcfee470 100644 --- a/src-qt5/desktop-utils/lumina-fileinfo/lumina-fileinfo.pro +++ b/src-qt5/desktop-utils/lumina-fileinfo/lumina-fileinfo.pro @@ -89,13 +89,13 @@ TRANSLATIONS = i18n/l-fileinfo_af.ts \ i18n/l-fileinfo_zu.ts dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ -dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ desktop.files=lumina-fileinfo.desktop desktop.path=$${L_SHAREDIR}/applications/ manpage.path=$${L_MANDIR}/man1/ -manpage.extra="$${MAN_ZIP} lumina-fileinfo.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-fileinfo.1.gz" +manpage.extra="$${MAN_ZIP} $$PWD/lumina-fileinfo.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-fileinfo.1.gz" INSTALLS += target desktop manpage diff --git a/src-qt5/desktop-utils/lumina-fm/MainUI.cpp b/src-qt5/desktop-utils/lumina-fm/MainUI.cpp index 28bfa20b..8455e3aa 100644 --- a/src-qt5/desktop-utils/lumina-fm/MainUI.cpp +++ b/src-qt5/desktop-utils/lumina-fm/MainUI.cpp @@ -118,6 +118,7 @@ QSize orig = settings->value("preferences/MainWindowSize", QSize()).toSize(); connect(TRAY, SIGNAL(JobsFinished()), this, SLOT(TrayJobsFinished()) ); if(DEBUG){ qDebug() << " - Done with init"; } ui->actionOpen_as_Root->setVisible(LUtils::isValidBinary("qsudo")); + ui->transferTreeView->setVisible(false); } MainUI::~MainUI(){ diff --git a/src-qt5/desktop-utils/lumina-fm/MainUI.ui b/src-qt5/desktop-utils/lumina-fm/MainUI.ui index a15f91c9..5f067786 100644 --- a/src-qt5/desktop-utils/lumina-fm/MainUI.ui +++ b/src-qt5/desktop-utils/lumina-fm/MainUI.ui @@ -69,7 +69,7 @@ <x>0</x> <y>0</y> <width>567</width> - <height>359</height> + <height>161</height> </rect> </property> <layout class="QHBoxLayout" name="BrowserLayout"> @@ -98,6 +98,16 @@ <widget class="QWidget" name="page_image"/> </widget> </item> + <item> + <widget class="QTreeView" name="transferTreeView"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> </layout> </widget> <widget class="QMenuBar" name="menubar"> diff --git a/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro b/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro index 4f66ce0a..b59aface 100644 --- a/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro +++ b/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro @@ -126,13 +126,13 @@ TRANSLATIONS = i18n/lumina-fm_af.ts \ i18n/lumina-fm_zu.ts dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ -dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ desktop.files=lumina-fm.desktop desktop.path=$${L_SHAREDIR}/applications/ manpage.path=$${L_MANDIR}/man1/ -manpage.extra="$${MAN_ZIP} lumina-fm.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-fm.1.gz" +manpage.extra="$${MAN_ZIP} $$PWD/lumina-fm.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-fm.1.gz" INSTALLS += target desktop icons manpage diff --git a/src-qt5/desktop-utils/lumina-fm/transferd.cpp b/src-qt5/desktop-utils/lumina-fm/transferd.cpp new file mode 100644 index 00000000..c5a0a156 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm/transferd.cpp @@ -0,0 +1,28 @@ + + +int totaltransactions = sel.length(); +QList<TransactionInfo> transaction; +for(int i=0;i<sel.length();i++){ + QStringList info; + info << sel[i] << sel[i].size() << false; + totalsize = totalsize + sel[i].size(); +} +bool paused = false; +for(int i=0; i<transaction.length(); i++){ + +while(paused = 1 ){ + pausetimer = new QTimer(this); + pausetimer->start(5000); +} +QElapsedTimer timer; +timer.start(); +//copy/move file +timer.elapsed(); // "milliseconds" +transferTime = transferTime + timer.elapsed() +transaction[i].value(2) = true; +currentTransfered++; +currentTransferedSize = currentTransferedSize + transaction[i].value(1); +//calculate transfer data rate from transferTime and currentTransferedSize +avgTransferRate = ( currentTransferedSize / (transferTime * 1000) ) +//can do estimates on potential time? +} diff --git a/src-qt5/desktop-utils/lumina-fm/transferd.h b/src-qt5/desktop-utils/lumina-fm/transferd.h new file mode 100644 index 00000000..291541e8 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm/transferd.h @@ -0,0 +1,13 @@ +class transactionInfo{ +public: + QString filepath; + qint64 filesize; + Bool finished; +}; + + +QStringList sel; +int totaltransactions currentTransfered; +qint64 totalsize, currentTransferedSize, transferTime, avgTransferRate; +bool paused; +QElapsedTimer timer; diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_ca.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_ca.ts index ba197b5c..de6a4daf 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_ca.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_ca.ts @@ -59,12 +59,12 @@ <message> <location filename="../mainUI.ui" line="368"/> <source>Love this song</source> - <translation>M'agrada aquesta cançó</translation> + <translation>M'agrada aquesta cançó</translation> </message> <message> <location filename="../mainUI.ui" line="384"/> <source>Tired of this song (will not play for a month)</source> - <translation>Cansat d'aquesta cançó (no sonarà durant un mes)</translation> + <translation>Cansat d'aquesta cançó (no sonarà durant un mes)</translation> </message> <message> <location filename="../mainUI.ui" line="397"/> @@ -84,7 +84,7 @@ <message> <location filename="../mainUI.ui" line="479"/> <source>Delete current station</source> - <translation>Suprimeix l'emissora actual</translation> + <translation>Suprimeix l'emissora actual</translation> </message> <message> <location filename="../mainUI.ui" line="482"/> @@ -129,17 +129,17 @@ <message> <location filename="../mainUI.ui" line="573"/> <source>Audio Quality</source> - <translation>Qualitat de l'àudio</translation> + <translation>Qualitat de l'àudio</translation> </message> <message> <location filename="../mainUI.ui" line="583"/> <source>Proxy URL</source> - <translation>URL de l'intermediari</translation> + <translation>URL de l'intermediari</translation> </message> <message> <location filename="../mainUI.ui" line="593"/> <source>Control Proxy URL</source> - <translation>Control de l'URL de l'intermediari</translation> + <translation>Control de l'URL de l'intermediari</translation> </message> <message> <location filename="../mainUI.ui" line="618"/> @@ -149,7 +149,7 @@ <message> <location filename="../mainUI.ui" line="656"/> <source>Audio Driver</source> - <translation>Controlador d'àudio</translation> + <translation>Controlador d'àudio</translation> </message> <message> <location filename="../mainUI.ui" line="681"/> @@ -194,7 +194,7 @@ <message> <location filename="../mainUI.ui" line="751"/> <source>Raise audio volume</source> - <translation>Apuja el volum de l'àudio</translation> + <translation>Apuja el volum de l'àudio</translation> </message> <message> <location filename="../mainUI.ui" line="756"/> @@ -204,12 +204,12 @@ <message> <location filename="../mainUI.ui" line="759"/> <source>Lower audio volume</source> - <translation>Abaixa el volum de l'àudio</translation> + <translation>Abaixa el volum de l'àudio</translation> </message> <message> <location filename="../mainUI.ui" line="764"/> <source>Close Application</source> - <translation>Tanca l'aplicació</translation> + <translation>Tanca l'aplicació</translation> </message> <message> <location filename="../mainUI.ui" line="767"/> @@ -224,12 +224,12 @@ <message> <location filename="../mainUI.ui" line="786"/> <source>From current artist</source> - <translation>De l'artista actual</translation> + <translation>De l'artista actual</translation> </message> <message> <location filename="../mainUI.ui" line="789"/> <source>Create station from current artist</source> - <translation>Crea una emissora de l'artista actual</translation> + <translation>Crea una emissora de l'artista actual</translation> </message> <message> <location filename="../mainUI.ui" line="794"/> @@ -280,7 +280,7 @@ <message> <location filename="../mainUI.cpp" line="105"/> <source>Please install the `pianobar` utility to enable this functionality</source> - <translation>Si us plau, instal·leu la utilitat "pianobar" per habilitar aquesta funcionalitat.</translation> + <translation>Si us plau, instal·leu la utilitat "pianobar" per habilitar aquesta funcionalitat.</translation> </message> <message> <location filename="../mainUI.cpp" line="109"/> @@ -332,7 +332,7 @@ <message> <location filename="../mainUI.cpp" line="492"/> <source>Media Buffering...</source> - <translation>S'omple la memòria intermèdia...</translation> + <translation>S'omple la memòria intermèdia...</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> @@ -368,67 +368,67 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="608"/> <source>Multimedia</source> - <translation type="unfinished"></translation> + <translation>Multimèdia</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="609"/> <source>Development</source> - <translation type="unfinished"></translation> + <translation>Desenvolupament</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> <source>Education</source> - <translation type="unfinished"></translation> + <translation>Educació</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> <source>Games</source> - <translation type="unfinished"></translation> + <translation>Jocs</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="612"/> <source>Graphics</source> - <translation type="unfinished"></translation> + <translation>Gràfics</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="613"/> <source>Network</source> - <translation type="unfinished"></translation> + <translation>Xarxa</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="614"/> <source>Office</source> - <translation type="unfinished"></translation> + <translation>Oficina</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> <source>Science</source> - <translation type="unfinished"></translation> + <translation>Ciència</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> <source>Settings</source> - <translation type="unfinished">Paràmetres</translation> + <translation>Paràmetres</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="617"/> <source>System</source> - <translation type="unfinished"></translation> + <translation>Sistema</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> <source>Utility</source> - <translation type="unfinished"></translation> + <translation>Utilitat</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> <source>Wine</source> - <translation type="unfinished"></translation> + <translation>Wine</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="620"/> <source>Unsorted</source> - <translation type="unfinished"></translation> + <translation>Sense classificar</translation> </message> </context> </TS> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_cs.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_cs.ts index b434a529..d1e93554 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_cs.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_cs.ts @@ -368,67 +368,67 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="608"/> <source>Multimedia</source> - <translation type="unfinished"></translation> + <translation>Multimédia</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="609"/> <source>Development</source> - <translation type="unfinished"></translation> + <translation>Vývoj</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> <source>Education</source> - <translation type="unfinished"></translation> + <translation>Výuka</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> <source>Games</source> - <translation type="unfinished"></translation> + <translation>Hry</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="612"/> <source>Graphics</source> - <translation type="unfinished"></translation> + <translation>Grafika</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="613"/> <source>Network</source> - <translation type="unfinished"></translation> + <translation>Sítě</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="614"/> <source>Office</source> - <translation type="unfinished"></translation> + <translation>Kancelář</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> <source>Science</source> - <translation type="unfinished"></translation> + <translation>Věda</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> <source>Settings</source> - <translation type="unfinished">Nastavení</translation> + <translation>Nastavení</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="617"/> <source>System</source> - <translation type="unfinished"></translation> + <translation>Systém</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> <source>Utility</source> - <translation type="unfinished"></translation> + <translation>Nástroje</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> <source>Wine</source> - <translation type="unfinished"></translation> + <translation>Wine</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="620"/> <source>Unsorted</source> - <translation type="unfinished"></translation> + <translation>Různé</translation> </message> </context> </TS> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_da.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_da.ts index b2f87e32..612ae523 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_da.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_da.ts @@ -368,67 +368,67 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="608"/> <source>Multimedia</source> - <translation type="unfinished"></translation> + <translation>Multimedie</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="609"/> <source>Development</source> - <translation type="unfinished"></translation> + <translation>Udvikling</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> <source>Education</source> - <translation type="unfinished"></translation> + <translation>Læring</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> <source>Games</source> - <translation type="unfinished"></translation> + <translation>Spil</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="612"/> <source>Graphics</source> - <translation type="unfinished"></translation> + <translation>Grafik</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="613"/> <source>Network</source> - <translation type="unfinished"></translation> + <translation>Netværk</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="614"/> <source>Office</source> - <translation type="unfinished"></translation> + <translation>Kontor</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> <source>Science</source> - <translation type="unfinished"></translation> + <translation>Naturvidenskab</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> <source>Settings</source> - <translation type="unfinished">Indstillinger</translation> + <translation>Indstillinger</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="617"/> <source>System</source> - <translation type="unfinished"></translation> + <translation>System</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> <source>Utility</source> - <translation type="unfinished"></translation> + <translation>Redskab</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> <source>Wine</source> - <translation type="unfinished"></translation> + <translation>Wine</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="620"/> <source>Unsorted</source> - <translation type="unfinished"></translation> + <translation>Usorteret</translation> </message> </context> </TS> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_de.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_de.ts index 7ab5151e..ac56615b 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_de.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_de.ts @@ -7,94 +7,94 @@ <location filename="../mainUI.ui" line="14"/> <location filename="../mainUI.cpp" line="285"/> <source>Media Player</source> - <translation type="unfinished"></translation> + <translation>Medienabspieler</translation> </message> <message> <location filename="../mainUI.ui" line="50"/> <location filename="../mainUI.ui" line="261"/> <location filename="../mainUI.cpp" line="631"/> <source>Now Playing</source> - <translation type="unfinished"></translation> + <translation>Wiedergabe läuft jetzt</translation> </message> <message> <location filename="../mainUI.ui" line="74"/> <source>(No Running Video)</source> - <translation type="unfinished"></translation> + <translation>(Kein laufendes Video)</translation> </message> <message> <location filename="../mainUI.ui" line="105"/> <source>Playlist</source> - <translation type="unfinished"></translation> + <translation>Wiedergabeliste</translation> </message> <message> <location filename="../mainUI.ui" line="167"/> <source>up</source> - <translation type="unfinished"></translation> + <translation>hinauf</translation> </message> <message> <location filename="../mainUI.ui" line="183"/> <source>down</source> - <translation type="unfinished"></translation> + <translation>herab</translation> </message> <message> <location filename="../mainUI.ui" line="267"/> <source>Current Song</source> - <translation type="unfinished"></translation> + <translation>Aktueller Song</translation> </message> <message> <location filename="../mainUI.ui" line="303"/> <source>TITLE</source> - <translation type="unfinished"></translation> + <translation>TITEL</translation> </message> <message> <location filename="../mainUI.ui" line="327"/> <source>ARTIST</source> - <translation type="unfinished"></translation> + <translation>INTERPRET</translation> </message> <message> <location filename="../mainUI.ui" line="337"/> <source>ALBUM</source> - <translation type="unfinished"></translation> + <translation>ALBUM</translation> </message> <message> <location filename="../mainUI.ui" line="368"/> <source>Love this song</source> - <translation type="unfinished"></translation> + <translation>Liebe diesen Song</translation> </message> <message> <location filename="../mainUI.ui" line="384"/> <source>Tired of this song (will not play for a month)</source> - <translation type="unfinished"></translation> + <translation>Müde von diesem Song (wird einen Monat lang nicht gespielt)</translation> </message> <message> <location filename="../mainUI.ui" line="397"/> <source>Ban this song (will never play again)</source> - <translation type="unfinished"></translation> + <translation>Diesen Song verbannen (wird nie wieder abgespielt)</translation> </message> <message> <location filename="../mainUI.ui" line="417"/> <source>View details about song (launches web browser)</source> - <translation type="unfinished"></translation> + <translation>Details zum Song anzeigen (startet den Webbrowser)</translation> </message> <message> <location filename="../mainUI.ui" line="448"/> <source>Current Station</source> - <translation type="unfinished"></translation> + <translation>Aktueller Sender</translation> </message> <message> <location filename="../mainUI.ui" line="479"/> <source>Delete current station</source> - <translation type="unfinished"></translation> + <translation>Aktuellen Sender löschen</translation> </message> <message> <location filename="../mainUI.ui" line="482"/> <source>rm</source> - <translation type="unfinished"></translation> + <translation>rm</translation> </message> <message> <location filename="../mainUI.ui" line="492"/> <source>Create new station</source> - <translation type="unfinished"></translation> + <translation>Neuen Sender erstellen</translation> </message> <message> <location filename="../mainUI.ui" line="495"/> @@ -104,37 +104,37 @@ <message> <location filename="../mainUI.ui" line="512"/> <source>Settings</source> - <translation type="unfinished"></translation> + <translation>Einstellungen</translation> </message> <message> <location filename="../mainUI.ui" line="521"/> <source>Pandora Account Login</source> - <translation type="unfinished"></translation> + <translation>Pandora-Kontoanmeldung</translation> </message> <message> <location filename="../mainUI.ui" line="527"/> <source>Email</source> - <translation type="unfinished"></translation> + <translation>E-Mail</translation> </message> <message> <location filename="../mainUI.ui" line="537"/> <source>Password</source> - <translation type="unfinished"></translation> + <translation>Passwort</translation> </message> <message> <location filename="../mainUI.ui" line="557"/> <source><a href=https://www.pandora.com/account/register>Need an account?</a></source> - <translation type="unfinished"></translation> + <translation><a href=https://www.pandora.com/account/register>Benötigen Sie ein Konto?</a></translation> </message> <message> <location filename="../mainUI.ui" line="573"/> <source>Audio Quality</source> - <translation type="unfinished"></translation> + <translation>Audioqualität</translation> </message> <message> <location filename="../mainUI.ui" line="583"/> <source>Proxy URL</source> - <translation type="unfinished"></translation> + <translation>Proxy-URL</translation> </message> <message> <location filename="../mainUI.ui" line="593"/> @@ -144,77 +144,77 @@ <message> <location filename="../mainUI.ui" line="618"/> <source>Apply Settings</source> - <translation type="unfinished"></translation> + <translation>Einstellungen anwenden</translation> </message> <message> <location filename="../mainUI.ui" line="656"/> <source>Audio Driver</source> - <translation type="unfinished"></translation> + <translation>Audiotreiber</translation> </message> <message> <location filename="../mainUI.ui" line="681"/> <source>File</source> - <translation type="unfinished"></translation> + <translation>Datei</translation> </message> <message> <location filename="../mainUI.ui" line="688"/> <source>View</source> - <translation type="unfinished"></translation> + <translation>Ansicht</translation> </message> <message> <location filename="../mainUI.ui" line="723"/> <source>Play</source> - <translation type="unfinished"></translation> + <translation>Wiedergabe</translation> </message> <message> <location filename="../mainUI.ui" line="728"/> <source>Pause</source> - <translation type="unfinished"></translation> + <translation>Pause</translation> </message> <message> <location filename="../mainUI.ui" line="733"/> <source>Stop</source> - <translation type="unfinished"></translation> + <translation>Stopp</translation> </message> <message> <location filename="../mainUI.ui" line="738"/> <source>Next</source> - <translation type="unfinished"></translation> + <translation>Weiter</translation> </message> <message> <location filename="../mainUI.ui" line="743"/> <source>Back</source> - <translation type="unfinished"></translation> + <translation>Zurück</translation> </message> <message> <location filename="../mainUI.ui" line="748"/> <source>VolUp</source> - <translation type="unfinished"></translation> + <translation>Lautstärke erhöhen</translation> </message> <message> <location filename="../mainUI.ui" line="751"/> <source>Raise audio volume</source> - <translation type="unfinished"></translation> + <translation>Audiolautstärke erhöhen</translation> </message> <message> <location filename="../mainUI.ui" line="756"/> <source>VolDown</source> - <translation type="unfinished"></translation> + <translation>Lautstärke verringern</translation> </message> <message> <location filename="../mainUI.ui" line="759"/> <source>Lower audio volume</source> - <translation type="unfinished"></translation> + <translation>Audiolautstärke verringern</translation> </message> <message> <location filename="../mainUI.ui" line="764"/> <source>Close Application</source> - <translation type="unfinished"></translation> + <translation>Anwendung schließen</translation> </message> <message> <location filename="../mainUI.ui" line="767"/> <source>Ctrl+Q</source> - <translation type="unfinished"></translation> + <translation>Strg+Q</translation> </message> <message> <location filename="../mainUI.ui" line="781"/> @@ -224,7 +224,7 @@ <message> <location filename="../mainUI.ui" line="786"/> <source>From current artist</source> - <translation type="unfinished"></translation> + <translation>Vom aktuellen Interpreten</translation> </message> <message> <location filename="../mainUI.ui" line="789"/> @@ -234,7 +234,7 @@ <message> <location filename="../mainUI.ui" line="794"/> <source>From current song</source> - <translation type="unfinished"></translation> + <translation>Vom aktuellen Song</translation> </message> <message> <location filename="../mainUI.ui" line="797"/> @@ -244,84 +244,85 @@ <message> <location filename="../mainUI.ui" line="808"/> <source>Show song notifications</source> - <translation type="unfinished"></translation> + <translation>Song-Benachrichtigungen anzeigen</translation> </message> <message> <location filename="../mainUI.ui" line="813"/> <source>Search...</source> - <translation type="unfinished"></translation> + <translation>Suchen...</translation> </message> <message> <location filename="../mainUI.ui" line="816"/> <source>Search for a new station</source> - <translation type="unfinished"></translation> + <translation>Einen neuen Sender suchen</translation> </message> <message> <location filename="../mainUI.ui" line="828"/> <location filename="../mainUI.cpp" line="276"/> <source>Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Pandora Radio</translation> </message> <message> <location filename="../mainUI.ui" line="831"/> <source>Stream from Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Stream von Pandora Radio</translation> </message> <message> <location filename="../mainUI.ui" line="839"/> <source>Local Files</source> - <translation type="unfinished"></translation> + <translation>Lokale Dateien</translation> </message> <message> <location filename="../mainUI.ui" line="842"/> <source>Play Local Files</source> - <translation type="unfinished"></translation> + <translation>Lokale Dateien wiedergeben</translation> </message> <message> <location filename="../mainUI.cpp" line="105"/> <source>Please install the `pianobar` utility to enable this functionality</source> - <translation type="unfinished"></translation> + <translation>Bitte installieren Sie das Dienstprogramm `pianobar`, um diese Funktionalität zu aktivieren</translation> </message> <message> <location filename="../mainUI.cpp" line="109"/> <source>Stream music from the Pandora online radio service</source> - <translation type="unfinished"></translation> + <translation>Streaming von Musik vom Pandora Online-Radiodienst</translation> </message> <message> <location filename="../mainUI.cpp" line="122"/> <source>Low</source> - <translation type="unfinished"></translation> + <translation>Niedrig</translation> </message> <message> <location filename="../mainUI.cpp" line="123"/> <source>Medium</source> - <translation type="unfinished"></translation> + <translation>Mittel</translation> </message> <message> <location filename="../mainUI.cpp" line="124"/> <source>High</source> - <translation type="unfinished"></translation> + <translation>Hoch</translation> </message> <message> <location filename="../mainUI.cpp" line="358"/> <source>Open Multimedia Files</source> - <translation type="unfinished"></translation> + <translation>Multimedia-Dateien öffnen</translation> </message> <message> <location filename="../mainUI.cpp" line="406"/> <source>Now Playing:</source> - <translation type="unfinished"></translation> + <translation>Wird gerade wiedergegeben:</translation> </message> <message> <location filename="../mainUI.cpp" line="471"/> <source>[PLAYBACK ERROR] %1</source> - <translation type="unfinished"></translation> + <translation>[WIEDERGABEFEHLER] +%1</translation> </message> <message> <location filename="../mainUI.cpp" line="488"/> <source>Media Loading...</source> - <translation type="unfinished"></translation> + <translation>Medieninhalt wird geladen...</translation> </message> <message> <location filename="../mainUI.cpp" line="490"/> @@ -331,27 +332,27 @@ <message> <location filename="../mainUI.cpp" line="492"/> <source>Media Buffering...</source> - <translation type="unfinished"></translation> + <translation>Medieninhalt wird gepuffert...</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> <source>Pandora: Create Station</source> - <translation type="unfinished"></translation> + <translation>Pandora: Sender erstellen</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> <source>Search Term</source> - <translation type="unfinished"></translation> + <translation>Suchbegriff</translation> </message> <message> <location filename="../mainUI.cpp" line="654"/> <source>Pandora Question</source> - <translation type="unfinished"></translation> + <translation>Pandora-Frage</translation> </message> <message> <location filename="../mainUI.cpp" line="659"/> <source>Pandora Error</source> - <translation type="unfinished"></translation> + <translation>Pandora-Fehler</translation> </message> </context> <context> @@ -359,7 +360,7 @@ <message> <location filename="../PianoBarProcess.cpp" line="358"/> <source>Could not find any matches. Please try a different search term</source> - <translation type="unfinished"></translation> + <translation>Keine Treffer gefunden. Bitte versuchen Sie einen anderen Suchbegriff</translation> </message> </context> <context> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_fi.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_fi.ts index 632ef536..5d01912a 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_fi.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_fi.ts @@ -7,134 +7,134 @@ <location filename="../mainUI.ui" line="14"/> <location filename="../mainUI.cpp" line="285"/> <source>Media Player</source> - <translation type="unfinished"></translation> + <translation>Mediasoitin</translation> </message> <message> <location filename="../mainUI.ui" line="50"/> <location filename="../mainUI.ui" line="261"/> <location filename="../mainUI.cpp" line="631"/> <source>Now Playing</source> - <translation type="unfinished"></translation> + <translation>Nyt soi</translation> </message> <message> <location filename="../mainUI.ui" line="74"/> <source>(No Running Video)</source> - <translation type="unfinished"></translation> + <translation>(Ei videota käynnissä)</translation> </message> <message> <location filename="../mainUI.ui" line="105"/> <source>Playlist</source> - <translation type="unfinished"></translation> + <translation>Soittolista</translation> </message> <message> <location filename="../mainUI.ui" line="167"/> <source>up</source> - <translation type="unfinished"></translation> + <translation>ylemmäs</translation> </message> <message> <location filename="../mainUI.ui" line="183"/> <source>down</source> - <translation type="unfinished"></translation> + <translation>alemmas</translation> </message> <message> <location filename="../mainUI.ui" line="267"/> <source>Current Song</source> - <translation type="unfinished"></translation> + <translation>Nykyinen kappale</translation> </message> <message> <location filename="../mainUI.ui" line="303"/> <source>TITLE</source> - <translation type="unfinished"></translation> + <translation>NIMI</translation> </message> <message> <location filename="../mainUI.ui" line="327"/> <source>ARTIST</source> - <translation type="unfinished"></translation> + <translation>ARTISTI</translation> </message> <message> <location filename="../mainUI.ui" line="337"/> <source>ALBUM</source> - <translation type="unfinished"></translation> + <translation>ALBUMI</translation> </message> <message> <location filename="../mainUI.ui" line="368"/> <source>Love this song</source> - <translation type="unfinished"></translation> + <translation>Tykkään tästä</translation> </message> <message> <location filename="../mainUI.ui" line="384"/> <source>Tired of this song (will not play for a month)</source> - <translation type="unfinished"></translation> + <translation>Kyllästynyt tähän (ei soiteta kuukauteen)</translation> </message> <message> <location filename="../mainUI.ui" line="397"/> <source>Ban this song (will never play again)</source> - <translation type="unfinished"></translation> + <translation>Estä tämä (ei soiteta enää)</translation> </message> <message> <location filename="../mainUI.ui" line="417"/> <source>View details about song (launches web browser)</source> - <translation type="unfinished"></translation> + <translation>Näytä kappaleen tiedot (käynnistää verkkoselaimen)</translation> </message> <message> <location filename="../mainUI.ui" line="448"/> <source>Current Station</source> - <translation type="unfinished"></translation> + <translation>Nykyinen asema</translation> </message> <message> <location filename="../mainUI.ui" line="479"/> <source>Delete current station</source> - <translation type="unfinished"></translation> + <translation>Poista nykyinen asema</translation> </message> <message> <location filename="../mainUI.ui" line="482"/> <source>rm</source> - <translation type="unfinished"></translation> + <translation>poista</translation> </message> <message> <location filename="../mainUI.ui" line="492"/> <source>Create new station</source> - <translation type="unfinished"></translation> + <translation>Luo uusi asema</translation> </message> <message> <location filename="../mainUI.ui" line="495"/> <source>add</source> - <translation type="unfinished"></translation> + <translation>lisää</translation> </message> <message> <location filename="../mainUI.ui" line="512"/> <source>Settings</source> - <translation type="unfinished"></translation> + <translation>Asetukset</translation> </message> <message> <location filename="../mainUI.ui" line="521"/> <source>Pandora Account Login</source> - <translation type="unfinished"></translation> + <translation>Kirjautuminen Pandora-tilille</translation> </message> <message> <location filename="../mainUI.ui" line="527"/> <source>Email</source> - <translation type="unfinished"></translation> + <translation>Sähköposti</translation> </message> <message> <location filename="../mainUI.ui" line="537"/> <source>Password</source> - <translation type="unfinished"></translation> + <translation>Salasana</translation> </message> <message> <location filename="../mainUI.ui" line="557"/> <source><a href=https://www.pandora.com/account/register>Need an account?</a></source> - <translation type="unfinished"></translation> + <translation><a href=https://www.pandora.com/account/register>Tarvitsetko tilin?</a></translation> </message> <message> <location filename="../mainUI.ui" line="573"/> <source>Audio Quality</source> - <translation type="unfinished"></translation> + <translation>Äänenlaatu</translation> </message> <message> <location filename="../mainUI.ui" line="583"/> <source>Proxy URL</source> - <translation type="unfinished"></translation> + <translation>Välityspalvelimen osoite</translation> </message> <message> <location filename="../mainUI.ui" line="593"/> @@ -144,47 +144,47 @@ <message> <location filename="../mainUI.ui" line="618"/> <source>Apply Settings</source> - <translation type="unfinished"></translation> + <translation>Ota asetukset käyttöön</translation> </message> <message> <location filename="../mainUI.ui" line="656"/> <source>Audio Driver</source> - <translation type="unfinished"></translation> + <translation>Ääniajuri</translation> </message> <message> <location filename="../mainUI.ui" line="681"/> <source>File</source> - <translation type="unfinished"></translation> + <translation>Tiedosto</translation> </message> <message> <location filename="../mainUI.ui" line="688"/> <source>View</source> - <translation type="unfinished"></translation> + <translation>Näytä</translation> </message> <message> <location filename="../mainUI.ui" line="723"/> <source>Play</source> - <translation type="unfinished"></translation> + <translation>Toista</translation> </message> <message> <location filename="../mainUI.ui" line="728"/> <source>Pause</source> - <translation type="unfinished"></translation> + <translation>Tauko</translation> </message> <message> <location filename="../mainUI.ui" line="733"/> <source>Stop</source> - <translation type="unfinished"></translation> + <translation>Pysäytä</translation> </message> <message> <location filename="../mainUI.ui" line="738"/> <source>Next</source> - <translation type="unfinished"></translation> + <translation>Seuraava</translation> </message> <message> <location filename="../mainUI.ui" line="743"/> <source>Back</source> - <translation type="unfinished"></translation> + <translation>Takaisin</translation> </message> <message> <location filename="../mainUI.ui" line="748"/> @@ -194,7 +194,7 @@ <message> <location filename="../mainUI.ui" line="751"/> <source>Raise audio volume</source> - <translation type="unfinished"></translation> + <translation>Nosta äänenvoimakkuutta</translation> </message> <message> <location filename="../mainUI.ui" line="756"/> @@ -204,12 +204,12 @@ <message> <location filename="../mainUI.ui" line="759"/> <source>Lower audio volume</source> - <translation type="unfinished"></translation> + <translation>Laske äänenvoimakkuutta</translation> </message> <message> <location filename="../mainUI.ui" line="764"/> <source>Close Application</source> - <translation type="unfinished"></translation> + <translation>Sulje sovellus</translation> </message> <message> <location filename="../mainUI.ui" line="767"/> @@ -219,27 +219,27 @@ <message> <location filename="../mainUI.ui" line="781"/> <source>Close to tray when active</source> - <translation type="unfinished"></translation> + <translation>Sulje aktiivisena ilmoitusalueelle</translation> </message> <message> <location filename="../mainUI.ui" line="786"/> <source>From current artist</source> - <translation type="unfinished"></translation> + <translation>Nykyiseltä artistilta</translation> </message> <message> <location filename="../mainUI.ui" line="789"/> <source>Create station from current artist</source> - <translation type="unfinished"></translation> + <translation>Luo nykyisestä artistista asema</translation> </message> <message> <location filename="../mainUI.ui" line="794"/> <source>From current song</source> - <translation type="unfinished"></translation> + <translation>Nykyisestä kappaleesta</translation> </message> <message> <location filename="../mainUI.ui" line="797"/> <source>Create station from current song</source> - <translation type="unfinished"></translation> + <translation>Luo nykyisestä kappaleesta asema</translation> </message> <message> <location filename="../mainUI.ui" line="808"/> @@ -249,43 +249,43 @@ <message> <location filename="../mainUI.ui" line="813"/> <source>Search...</source> - <translation type="unfinished"></translation> + <translation>Etsi...</translation> </message> <message> <location filename="../mainUI.ui" line="816"/> <source>Search for a new station</source> - <translation type="unfinished"></translation> + <translation>Etsi uutta asemaa</translation> </message> <message> <location filename="../mainUI.ui" line="828"/> <location filename="../mainUI.cpp" line="276"/> <source>Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Pandora-radio</translation> </message> <message> <location filename="../mainUI.ui" line="831"/> <source>Stream from Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Virtaus Pandora-radiosta</translation> </message> <message> <location filename="../mainUI.ui" line="839"/> <source>Local Files</source> - <translation type="unfinished"></translation> + <translation>Paikalliset tiedostot</translation> </message> <message> <location filename="../mainUI.ui" line="842"/> <source>Play Local Files</source> - <translation type="unfinished"></translation> + <translation>Toista paikallisia tiedostoja</translation> </message> <message> <location filename="../mainUI.cpp" line="105"/> <source>Please install the `pianobar` utility to enable this functionality</source> - <translation type="unfinished"></translation> + <translation>Toiminnon käyttäminen vaatii pianobar-ohjelman asentamista</translation> </message> <message> <location filename="../mainUI.cpp" line="109"/> <source>Stream music from the Pandora online radio service</source> - <translation type="unfinished"></translation> + <translation>Virtauta musiikkia Pandora-verkkoradiopalvelusta</translation> </message> <message> <location filename="../mainUI.cpp" line="122"/> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_hu.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_hu.ts index 80414a8b..1a2cf1aa 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_hu.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_hu.ts @@ -7,7 +7,7 @@ <location filename="../mainUI.ui" line="14"/> <location filename="../mainUI.cpp" line="285"/> <source>Media Player</source> - <translation type="unfinished"></translation> + <translation>Média lejátszó</translation> </message> <message> <location filename="../mainUI.ui" line="50"/> @@ -154,7 +154,7 @@ <message> <location filename="../mainUI.ui" line="681"/> <source>File</source> - <translation type="unfinished"></translation> + <translation type="unfinished">Fájl</translation> </message> <message> <location filename="../mainUI.ui" line="688"/> @@ -362,72 +362,4 @@ <translation type="unfinished"></translation> </message> </context> -<context> - <name>XDGDesktopList</name> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="608"/> - <source>Multimedia</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="609"/> - <source>Development</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> - <source>Education</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> - <source>Games</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="612"/> - <source>Graphics</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="613"/> - <source>Network</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="614"/> - <source>Office</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> - <source>Science</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> - <source>Settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="617"/> - <source>System</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> - <source>Utility</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> - <source>Wine</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../../../core/libLumina/LuminaXDG.cpp" line="620"/> - <source>Unsorted</source> - <translation type="unfinished"></translation> - </message> -</context> </TS> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_lt.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_lt.ts index ecaf4cbc..f10cf90d 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_lt.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_lt.ts @@ -19,7 +19,7 @@ <message> <location filename="../mainUI.ui" line="74"/> <source>(No Running Video)</source> - <translation type="unfinished"></translation> + <translation>(Nėra paleisto vaizdo įrašo)</translation> </message> <message> <location filename="../mainUI.ui" line="105"/> @@ -89,7 +89,7 @@ <message> <location filename="../mainUI.ui" line="482"/> <source>rm</source> - <translation type="unfinished"></translation> + <translation>šalinti</translation> </message> <message> <location filename="../mainUI.ui" line="492"/> @@ -109,7 +109,7 @@ <message> <location filename="../mainUI.ui" line="521"/> <source>Pandora Account Login</source> - <translation type="unfinished"></translation> + <translation>Pandora paskyros prisijungimas</translation> </message> <message> <location filename="../mainUI.ui" line="527"/> @@ -139,7 +139,7 @@ <message> <location filename="../mainUI.ui" line="593"/> <source>Control Proxy URL</source> - <translation type="unfinished"></translation> + <translation>Valdymo įgaliotojo serverio URL</translation> </message> <message> <location filename="../mainUI.ui" line="618"/> @@ -224,22 +224,22 @@ <message> <location filename="../mainUI.ui" line="786"/> <source>From current artist</source> - <translation type="unfinished"></translation> + <translation>Iš esamo atlikėjo</translation> </message> <message> <location filename="../mainUI.ui" line="789"/> <source>Create station from current artist</source> - <translation type="unfinished"></translation> + <translation>Sukurti stotį iš esamo atlikėjo</translation> </message> <message> <location filename="../mainUI.ui" line="794"/> <source>From current song</source> - <translation type="unfinished"></translation> + <translation>Iš esamos dainos</translation> </message> <message> <location filename="../mainUI.ui" line="797"/> <source>Create station from current song</source> - <translation type="unfinished"></translation> + <translation>Sukurti stotį iš esamos dainos</translation> </message> <message> <location filename="../mainUI.ui" line="808"/> @@ -249,23 +249,23 @@ <message> <location filename="../mainUI.ui" line="813"/> <source>Search...</source> - <translation type="unfinished"></translation> + <translation>Ieškoti...</translation> </message> <message> <location filename="../mainUI.ui" line="816"/> <source>Search for a new station</source> - <translation type="unfinished"></translation> + <translation>Ieškoti naujos stoties</translation> </message> <message> <location filename="../mainUI.ui" line="828"/> <location filename="../mainUI.cpp" line="276"/> <source>Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Pandora radijas</translation> </message> <message> <location filename="../mainUI.ui" line="831"/> <source>Stream from Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Transliuoti iš Pandora radijo</translation> </message> <message> <location filename="../mainUI.ui" line="839"/> @@ -280,27 +280,27 @@ <message> <location filename="../mainUI.cpp" line="105"/> <source>Please install the `pianobar` utility to enable this functionality</source> - <translation>Norėdami įjungti šį funkcionalumą, įdiekite "pianobar" paslaugų programą</translation> + <translation>Norėdami įjungti šį funkcionalumą, įdiekite "pianobar" paslaugų programą</translation> </message> <message> <location filename="../mainUI.cpp" line="109"/> <source>Stream music from the Pandora online radio service</source> - <translation type="unfinished"></translation> + <translation>Transliuoti muziką iš Pandora internetinio radijo paslaugos</translation> </message> <message> <location filename="../mainUI.cpp" line="122"/> <source>Low</source> - <translation type="unfinished"></translation> + <translation>Žema</translation> </message> <message> <location filename="../mainUI.cpp" line="123"/> <source>Medium</source> - <translation type="unfinished"></translation> + <translation>Vidutinė</translation> </message> <message> <location filename="../mainUI.cpp" line="124"/> <source>High</source> - <translation type="unfinished"></translation> + <translation>Aukšta</translation> </message> <message> <location filename="../mainUI.cpp" line="358"/> @@ -316,32 +316,33 @@ <location filename="../mainUI.cpp" line="471"/> <source>[PLAYBACK ERROR] %1</source> - <translation type="unfinished"></translation> + <translation>[ATKŪRIMO KLAIDA] +%1</translation> </message> <message> <location filename="../mainUI.cpp" line="488"/> <source>Media Loading...</source> - <translation type="unfinished"></translation> + <translation>Medija įkeliama...</translation> </message> <message> <location filename="../mainUI.cpp" line="490"/> <source>Media Stalled...</source> - <translation type="unfinished"></translation> + <translation>Medija atitrūko...</translation> </message> <message> <location filename="../mainUI.cpp" line="492"/> <source>Media Buffering...</source> - <translation type="unfinished"></translation> + <translation>Medijos buferizacija...</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> <source>Pandora: Create Station</source> - <translation type="unfinished"></translation> + <translation>Pandora: Sukurti stotį</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> <source>Search Term</source> - <translation type="unfinished"></translation> + <translation>Ieškomas žodis</translation> </message> <message> <location filename="../mainUI.cpp" line="654"/> @@ -359,7 +360,7 @@ <message> <location filename="../PianoBarProcess.cpp" line="358"/> <source>Could not find any matches. Please try a different search term</source> - <translation type="unfinished"></translation> + <translation>Nepavyko rasti jokių atitikmenų. Pabandykite kitokį ieškomą žodį</translation> </message> </context> <context> @@ -367,67 +368,67 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="608"/> <source>Multimedia</source> - <translation type="unfinished"></translation> + <translation>Multimedija</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="609"/> <source>Development</source> - <translation type="unfinished"></translation> + <translation>Programavimas</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> <source>Education</source> - <translation type="unfinished"></translation> + <translation>Švietimas</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> <source>Games</source> - <translation type="unfinished"></translation> + <translation>Žaidimai</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="612"/> <source>Graphics</source> - <translation type="unfinished"></translation> + <translation>Grafika</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="613"/> <source>Network</source> - <translation type="unfinished"></translation> + <translation>Tinklas</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="614"/> <source>Office</source> - <translation type="unfinished"></translation> + <translation>Raštinė</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> <source>Science</source> - <translation type="unfinished"></translation> + <translation>Mokslas</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> <source>Settings</source> - <translation type="unfinished">Nustatymai</translation> + <translation>Nustatymai</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="617"/> <source>System</source> - <translation type="unfinished"></translation> + <translation>Sistema</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> <source>Utility</source> - <translation type="unfinished"></translation> + <translation>Paslaugų programos</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> <source>Wine</source> - <translation type="unfinished"></translation> + <translation>Wine</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="620"/> <source>Unsorted</source> - <translation type="unfinished"></translation> + <translation>Nesurūšiuota</translation> </message> </context> </TS> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_nl.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_nl.ts index ba312720..860a0aaa 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_nl.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_nl.ts @@ -7,310 +7,310 @@ <location filename="../mainUI.ui" line="14"/> <location filename="../mainUI.cpp" line="285"/> <source>Media Player</source> - <translation type="unfinished"></translation> + <translation>Mediaspeler</translation> </message> <message> <location filename="../mainUI.ui" line="50"/> <location filename="../mainUI.ui" line="261"/> <location filename="../mainUI.cpp" line="631"/> <source>Now Playing</source> - <translation type="unfinished"></translation> + <translation>Nu wordt afgespeeld</translation> </message> <message> <location filename="../mainUI.ui" line="74"/> <source>(No Running Video)</source> - <translation type="unfinished"></translation> + <translation>(geen video wordt op dit moment afgespeeld)</translation> </message> <message> <location filename="../mainUI.ui" line="105"/> <source>Playlist</source> - <translation type="unfinished"></translation> + <translation>Afspeellijst</translation> </message> <message> <location filename="../mainUI.ui" line="167"/> <source>up</source> - <translation type="unfinished"></translation> + <translation>omhoog</translation> </message> <message> <location filename="../mainUI.ui" line="183"/> <source>down</source> - <translation type="unfinished"></translation> + <translation>omlaag</translation> </message> <message> <location filename="../mainUI.ui" line="267"/> <source>Current Song</source> - <translation type="unfinished"></translation> + <translation>Huidig nummer</translation> </message> <message> <location filename="../mainUI.ui" line="303"/> <source>TITLE</source> - <translation type="unfinished"></translation> + <translation>TITEL</translation> </message> <message> <location filename="../mainUI.ui" line="327"/> <source>ARTIST</source> - <translation type="unfinished"></translation> + <translation>ARTIEST</translation> </message> <message> <location filename="../mainUI.ui" line="337"/> <source>ALBUM</source> - <translation type="unfinished"></translation> + <translation>ALBUM</translation> </message> <message> <location filename="../mainUI.ui" line="368"/> <source>Love this song</source> - <translation type="unfinished"></translation> + <translation>Houd van dit dit nummer</translation> </message> <message> <location filename="../mainUI.ui" line="384"/> <source>Tired of this song (will not play for a month)</source> - <translation type="unfinished"></translation> + <translation>Heb het even gehad met dit nummer (wordt gedurende een maand niet afgespeeld)</translation> </message> <message> <location filename="../mainUI.ui" line="397"/> <source>Ban this song (will never play again)</source> - <translation type="unfinished"></translation> + <translation>Verban dit nummer! (zal nooit meer worden afgespeeld)</translation> </message> <message> <location filename="../mainUI.ui" line="417"/> <source>View details about song (launches web browser)</source> - <translation type="unfinished"></translation> + <translation>Bekijk meer informatie over dit nummer (start je internet browser op)</translation> </message> <message> <location filename="../mainUI.ui" line="448"/> <source>Current Station</source> - <translation type="unfinished"></translation> + <translation>Huidig radiostation</translation> </message> <message> <location filename="../mainUI.ui" line="479"/> <source>Delete current station</source> - <translation type="unfinished"></translation> + <translation>Verwijder huidig radiostation</translation> </message> <message> <location filename="../mainUI.ui" line="482"/> <source>rm</source> - <translation type="unfinished"></translation> + <translation>rm</translation> </message> <message> <location filename="../mainUI.ui" line="492"/> <source>Create new station</source> - <translation type="unfinished"></translation> + <translation>Maak een nieuw station aan</translation> </message> <message> <location filename="../mainUI.ui" line="495"/> <source>add</source> - <translation type="unfinished"></translation> + <translation>voeg toe</translation> </message> <message> <location filename="../mainUI.ui" line="512"/> <source>Settings</source> - <translation type="unfinished"></translation> + <translation>Voorkeuren</translation> </message> <message> <location filename="../mainUI.ui" line="521"/> <source>Pandora Account Login</source> - <translation type="unfinished"></translation> + <translation>Inloggen met uw Pandora Account</translation> </message> <message> <location filename="../mainUI.ui" line="527"/> <source>Email</source> - <translation type="unfinished"></translation> + <translation>E-mail</translation> </message> <message> <location filename="../mainUI.ui" line="537"/> <source>Password</source> - <translation type="unfinished"></translation> + <translation>Wachtwoord</translation> </message> <message> <location filename="../mainUI.ui" line="557"/> <source><a href=https://www.pandora.com/account/register>Need an account?</a></source> - <translation type="unfinished"></translation> + <translation><a href=https://www.pandora.com/account/register>Nog geen account?</a></translation> </message> <message> <location filename="../mainUI.ui" line="573"/> <source>Audio Quality</source> - <translation type="unfinished"></translation> + <translation>Geluidskwaliteit</translation> </message> <message> <location filename="../mainUI.ui" line="583"/> <source>Proxy URL</source> - <translation type="unfinished"></translation> + <translation>Proxy URL</translation> </message> <message> <location filename="../mainUI.ui" line="593"/> <source>Control Proxy URL</source> - <translation type="unfinished"></translation> + <translation>Controle Proxy URL</translation> </message> <message> <location filename="../mainUI.ui" line="618"/> <source>Apply Settings</source> - <translation type="unfinished"></translation> + <translation>Pas voorkeuren toe</translation> </message> <message> <location filename="../mainUI.ui" line="656"/> <source>Audio Driver</source> - <translation type="unfinished"></translation> + <translation>Geluidskaart</translation> </message> <message> <location filename="../mainUI.ui" line="681"/> <source>File</source> - <translation type="unfinished"></translation> + <translation>Bestand</translation> </message> <message> <location filename="../mainUI.ui" line="688"/> <source>View</source> - <translation type="unfinished"></translation> + <translation>Weergave</translation> </message> <message> <location filename="../mainUI.ui" line="723"/> <source>Play</source> - <translation type="unfinished"></translation> + <translation>Speel af</translation> </message> <message> <location filename="../mainUI.ui" line="728"/> <source>Pause</source> - <translation type="unfinished"></translation> + <translation>Pauze</translation> </message> <message> <location filename="../mainUI.ui" line="733"/> <source>Stop</source> - <translation type="unfinished"></translation> + <translation>Stop</translation> </message> <message> <location filename="../mainUI.ui" line="738"/> <source>Next</source> - <translation type="unfinished"></translation> + <translation>Volgende</translation> </message> <message> <location filename="../mainUI.ui" line="743"/> <source>Back</source> - <translation type="unfinished"></translation> + <translation>Vorige</translation> </message> <message> <location filename="../mainUI.ui" line="748"/> <source>VolUp</source> - <translation type="unfinished"></translation> + <translation>Volume omhoog</translation> </message> <message> <location filename="../mainUI.ui" line="751"/> <source>Raise audio volume</source> - <translation type="unfinished"></translation> + <translation>Verhoog het geluidsvolume</translation> </message> <message> <location filename="../mainUI.ui" line="756"/> <source>VolDown</source> - <translation type="unfinished"></translation> + <translation>Volume omlaag</translation> </message> <message> <location filename="../mainUI.ui" line="759"/> <source>Lower audio volume</source> - <translation type="unfinished"></translation> + <translation>Verlaag het geluidsvolume</translation> </message> <message> <location filename="../mainUI.ui" line="764"/> <source>Close Application</source> - <translation type="unfinished"></translation> + <translation>Sluit de applicatie af</translation> </message> <message> <location filename="../mainUI.ui" line="767"/> <source>Ctrl+Q</source> - <translation type="unfinished"></translation> + <translation>Ctrl+Q</translation> </message> <message> <location filename="../mainUI.ui" line="781"/> <source>Close to tray when active</source> - <translation type="unfinished"></translation> + <translation>Breng naar terug naar het systeemvak wanneer actief</translation> </message> <message> <location filename="../mainUI.ui" line="786"/> <source>From current artist</source> - <translation type="unfinished"></translation> + <translation>Van de huidige artiest</translation> </message> <message> <location filename="../mainUI.ui" line="789"/> <source>Create station from current artist</source> - <translation type="unfinished"></translation> + <translation>Maak een station aan voor de huidige artiest</translation> </message> <message> <location filename="../mainUI.ui" line="794"/> <source>From current song</source> - <translation type="unfinished"></translation> + <translation>Van het huidige nummer</translation> </message> <message> <location filename="../mainUI.ui" line="797"/> <source>Create station from current song</source> - <translation type="unfinished"></translation> + <translation>Maak een station aan op basis van het huidige nummer</translation> </message> <message> <location filename="../mainUI.ui" line="808"/> <source>Show song notifications</source> - <translation type="unfinished"></translation> + <translation>Laat afspeelberichten zien</translation> </message> <message> <location filename="../mainUI.ui" line="813"/> <source>Search...</source> - <translation type="unfinished"></translation> + <translation>Zoeken...</translation> </message> <message> <location filename="../mainUI.ui" line="816"/> <source>Search for a new station</source> - <translation type="unfinished"></translation> + <translation>Zoek een nieuw station</translation> </message> <message> <location filename="../mainUI.ui" line="828"/> <location filename="../mainUI.cpp" line="276"/> <source>Pandora Radio</source> - <translation type="unfinished"></translation> + <translation></translation> </message> <message> <location filename="../mainUI.ui" line="831"/> <source>Stream from Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Stream van Pandora Radio</translation> </message> <message> <location filename="../mainUI.ui" line="839"/> <source>Local Files</source> - <translation type="unfinished"></translation> + <translation>Lokale bestanden</translation> </message> <message> <location filename="../mainUI.ui" line="842"/> <source>Play Local Files</source> - <translation type="unfinished"></translation> + <translation>Speel lokale bestanden af</translation> </message> <message> <location filename="../mainUI.cpp" line="105"/> <source>Please install the `pianobar` utility to enable this functionality</source> - <translation type="unfinished"></translation> + <translation>Installeer alstublieft de 'pianobar' toepassing om deze functionaliteit te kunnen gebruiken</translation> </message> <message> <location filename="../mainUI.cpp" line="109"/> <source>Stream music from the Pandora online radio service</source> - <translation type="unfinished"></translation> + <translation>Stream muziek vanaf de Pandora online radio service</translation> </message> <message> <location filename="../mainUI.cpp" line="122"/> <source>Low</source> - <translation type="unfinished"></translation> + <translation>Laag</translation> </message> <message> <location filename="../mainUI.cpp" line="123"/> <source>Medium</source> - <translation type="unfinished"></translation> + <translation>Gemiddeld</translation> </message> <message> <location filename="../mainUI.cpp" line="124"/> <source>High</source> - <translation type="unfinished"></translation> + <translation>Hoog</translation> </message> <message> <location filename="../mainUI.cpp" line="358"/> <source>Open Multimedia Files</source> - <translation type="unfinished"></translation> + <translation>Open Multimedia bestanden</translation> </message> <message> <location filename="../mainUI.cpp" line="406"/> <source>Now Playing:</source> - <translation type="unfinished"></translation> + <translation>Nu aan het afspelen:</translation> </message> <message> <location filename="../mainUI.cpp" line="471"/> @@ -321,37 +321,37 @@ <message> <location filename="../mainUI.cpp" line="488"/> <source>Media Loading...</source> - <translation type="unfinished"></translation> + <translation>Media aan het laden...</translation> </message> <message> <location filename="../mainUI.cpp" line="490"/> <source>Media Stalled...</source> - <translation type="unfinished"></translation> + <translation>Media loopt vast...</translation> </message> <message> <location filename="../mainUI.cpp" line="492"/> <source>Media Buffering...</source> - <translation type="unfinished"></translation> + <translation>Media aan het bufferen....</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> <source>Pandora: Create Station</source> - <translation type="unfinished"></translation> + <translation>Pandora: Maak een station aan</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> <source>Search Term</source> - <translation type="unfinished"></translation> + <translation>Zoekterm</translation> </message> <message> <location filename="../mainUI.cpp" line="654"/> <source>Pandora Question</source> - <translation type="unfinished"></translation> + <translation>Pandora vraag</translation> </message> <message> <location filename="../mainUI.cpp" line="659"/> <source>Pandora Error</source> - <translation type="unfinished"></translation> + <translation>Pandora foutmelding</translation> </message> </context> <context> @@ -359,7 +359,7 @@ <message> <location filename="../PianoBarProcess.cpp" line="358"/> <source>Could not find any matches. Please try a different search term</source> - <translation type="unfinished"></translation> + <translation>Kon geen resultaten vinden. Probeer alstublieft een andere zoekterm</translation> </message> </context> <context> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_pt_BR.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_pt_BR.ts index f60ce2a0..d30de8ba 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_pt_BR.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_pt_BR.ts @@ -7,7 +7,7 @@ <location filename="../mainUI.ui" line="14"/> <location filename="../mainUI.cpp" line="285"/> <source>Media Player</source> - <translation type="unfinished">Media Player</translation> + <translation>Media Player</translation> </message> <message> <location filename="../mainUI.ui" line="50"/> @@ -24,7 +24,7 @@ <message> <location filename="../mainUI.ui" line="105"/> <source>Playlist</source> - <translation type="unfinished">Playlist</translation> + <translation>Lista de reprodução</translation> </message> <message> <location filename="../mainUI.ui" line="167"/> @@ -74,82 +74,82 @@ <message> <location filename="../mainUI.ui" line="417"/> <source>View details about song (launches web browser)</source> - <translation type="unfinished"></translation> + <translation>Ver detalhes da música (abre o navegador web)</translation> </message> <message> <location filename="../mainUI.ui" line="448"/> <source>Current Station</source> - <translation type="unfinished"></translation> + <translation>Estação atual</translation> </message> <message> <location filename="../mainUI.ui" line="479"/> <source>Delete current station</source> - <translation type="unfinished"></translation> + <translation>Remover estação atual</translation> </message> <message> <location filename="../mainUI.ui" line="482"/> <source>rm</source> - <translation type="unfinished"></translation> + <translation>rm</translation> </message> <message> <location filename="../mainUI.ui" line="492"/> <source>Create new station</source> - <translation type="unfinished"></translation> + <translation>Criar nova estação</translation> </message> <message> <location filename="../mainUI.ui" line="495"/> <source>add</source> - <translation type="unfinished"></translation> + <translation>Add</translation> </message> <message> <location filename="../mainUI.ui" line="512"/> <source>Settings</source> - <translation type="unfinished"></translation> + <translation>Configurações</translation> </message> <message> <location filename="../mainUI.ui" line="521"/> <source>Pandora Account Login</source> - <translation type="unfinished"></translation> + <translation>Login na conta Pandora</translation> </message> <message> <location filename="../mainUI.ui" line="527"/> <source>Email</source> - <translation type="unfinished"></translation> + <translation>E-mail</translation> </message> <message> <location filename="../mainUI.ui" line="537"/> <source>Password</source> - <translation type="unfinished"></translation> + <translation>Senha</translation> </message> <message> <location filename="../mainUI.ui" line="557"/> <source><a href=https://www.pandora.com/account/register>Need an account?</a></source> - <translation type="unfinished"></translation> + <translation><a href=https://www.pandora.com/account/register>Precisa de uma conta?</a></translation> </message> <message> <location filename="../mainUI.ui" line="573"/> <source>Audio Quality</source> - <translation type="unfinished"></translation> + <translation>Qualidade do áudio</translation> </message> <message> <location filename="../mainUI.ui" line="583"/> <source>Proxy URL</source> - <translation type="unfinished"></translation> + <translation>URL do proxy</translation> </message> <message> <location filename="../mainUI.ui" line="593"/> <source>Control Proxy URL</source> - <translation type="unfinished"></translation> + <translation>URL do Proxy de Controle</translation> </message> <message> <location filename="../mainUI.ui" line="618"/> <source>Apply Settings</source> - <translation type="unfinished"></translation> + <translation>Aplicar configurações</translation> </message> <message> <location filename="../mainUI.ui" line="656"/> <source>Audio Driver</source> - <translation type="unfinished"></translation> + <translation>Driver de áudio</translation> </message> <message> <location filename="../mainUI.ui" line="681"/> @@ -159,57 +159,57 @@ <message> <location filename="../mainUI.ui" line="688"/> <source>View</source> - <translation type="unfinished"></translation> + <translation>Ver</translation> </message> <message> <location filename="../mainUI.ui" line="723"/> <source>Play</source> - <translation type="unfinished"></translation> + <translation>Tocar</translation> </message> <message> <location filename="../mainUI.ui" line="728"/> <source>Pause</source> - <translation type="unfinished"></translation> + <translation>Pausar</translation> </message> <message> <location filename="../mainUI.ui" line="733"/> <source>Stop</source> - <translation type="unfinished"></translation> + <translation>Parar</translation> </message> <message> <location filename="../mainUI.ui" line="738"/> <source>Next</source> - <translation type="unfinished"></translation> + <translation>Avançar</translation> </message> <message> <location filename="../mainUI.ui" line="743"/> <source>Back</source> - <translation type="unfinished"></translation> + <translation>Voltar</translation> </message> <message> <location filename="../mainUI.ui" line="748"/> <source>VolUp</source> - <translation type="unfinished"></translation> + <translation>VolUp</translation> </message> <message> <location filename="../mainUI.ui" line="751"/> <source>Raise audio volume</source> - <translation type="unfinished"></translation> + <translation>Aumentar o volume do áudio</translation> </message> <message> <location filename="../mainUI.ui" line="756"/> <source>VolDown</source> - <translation type="unfinished"></translation> + <translation>VolDown</translation> </message> <message> <location filename="../mainUI.ui" line="759"/> <source>Lower audio volume</source> - <translation type="unfinished"></translation> + <translation>Diminuir o volume do áudio</translation> </message> <message> <location filename="../mainUI.ui" line="764"/> <source>Close Application</source> - <translation type="unfinished"></translation> + <translation>Fechar aplicação</translation> </message> <message> <location filename="../mainUI.ui" line="767"/> @@ -219,139 +219,140 @@ <message> <location filename="../mainUI.ui" line="781"/> <source>Close to tray when active</source> - <translation type="unfinished"></translation> + <translation>Fechar para a bandeja quando ativo</translation> </message> <message> <location filename="../mainUI.ui" line="786"/> <source>From current artist</source> - <translation type="unfinished"></translation> + <translation>Do artista atual</translation> </message> <message> <location filename="../mainUI.ui" line="789"/> <source>Create station from current artist</source> - <translation type="unfinished"></translation> + <translation>Criar estação do artista atual</translation> </message> <message> <location filename="../mainUI.ui" line="794"/> <source>From current song</source> - <translation type="unfinished"></translation> + <translation>Da música atual</translation> </message> <message> <location filename="../mainUI.ui" line="797"/> <source>Create station from current song</source> - <translation type="unfinished"></translation> + <translation>Criar uma estação da música atual</translation> </message> <message> <location filename="../mainUI.ui" line="808"/> <source>Show song notifications</source> - <translation type="unfinished"></translation> + <translation>Mostrar notificações de músicas</translation> </message> <message> <location filename="../mainUI.ui" line="813"/> <source>Search...</source> - <translation type="unfinished"></translation> + <translation>Procurar...</translation> </message> <message> <location filename="../mainUI.ui" line="816"/> <source>Search for a new station</source> - <translation type="unfinished"></translation> + <translation>Procurar uma nova estação</translation> </message> <message> <location filename="../mainUI.ui" line="828"/> <location filename="../mainUI.cpp" line="276"/> <source>Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Pandora Radio</translation> </message> <message> <location filename="../mainUI.ui" line="831"/> <source>Stream from Pandora Radio</source> - <translation type="unfinished"></translation> + <translation>Transmissão da Pandora Radio</translation> </message> <message> <location filename="../mainUI.ui" line="839"/> <source>Local Files</source> - <translation type="unfinished"></translation> + <translation>Arquivos locais</translation> </message> <message> <location filename="../mainUI.ui" line="842"/> <source>Play Local Files</source> - <translation type="unfinished"></translation> + <translation>Tocar arquivos locais</translation> </message> <message> <location filename="../mainUI.cpp" line="105"/> <source>Please install the `pianobar` utility to enable this functionality</source> - <translation type="unfinished"></translation> + <translation>Instale o utilitário `pianobar` para habilitar esta funcionalidade</translation> </message> <message> <location filename="../mainUI.cpp" line="109"/> <source>Stream music from the Pandora online radio service</source> - <translation type="unfinished"></translation> + <translation>Transmitir música do serviço de rádio on-line Pandora</translation> </message> <message> <location filename="../mainUI.cpp" line="122"/> <source>Low</source> - <translation type="unfinished"></translation> + <translation>Baixo</translation> </message> <message> <location filename="../mainUI.cpp" line="123"/> <source>Medium</source> - <translation type="unfinished"></translation> + <translation>Médio</translation> </message> <message> <location filename="../mainUI.cpp" line="124"/> <source>High</source> - <translation type="unfinished"></translation> + <translation>Alto</translation> </message> <message> <location filename="../mainUI.cpp" line="358"/> <source>Open Multimedia Files</source> - <translation type="unfinished"></translation> + <translation>Abrir arquivos multimídia</translation> </message> <message> <location filename="../mainUI.cpp" line="406"/> <source>Now Playing:</source> - <translation type="unfinished"></translation> + <translation>Tocando agora:</translation> </message> <message> <location filename="../mainUI.cpp" line="471"/> <source>[PLAYBACK ERROR] %1</source> - <translation type="unfinished"></translation> + <translation>[PLAYBACK ERROR] +%1</translation> </message> <message> <location filename="../mainUI.cpp" line="488"/> <source>Media Loading...</source> - <translation type="unfinished"></translation> + <translation>Carregando mídia...</translation> </message> <message> <location filename="../mainUI.cpp" line="490"/> <source>Media Stalled...</source> - <translation type="unfinished"></translation> + <translation>Mídia parada...</translation> </message> <message> <location filename="../mainUI.cpp" line="492"/> <source>Media Buffering...</source> - <translation type="unfinished"></translation> + <translation>Carregando mídia...</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> <source>Pandora: Create Station</source> - <translation type="unfinished"></translation> + <translation>Pandora: Criar estação</translation> </message> <message> <location filename="../mainUI.cpp" line="576"/> <source>Search Term</source> - <translation type="unfinished"></translation> + <translation>Procurar termo</translation> </message> <message> <location filename="../mainUI.cpp" line="654"/> <source>Pandora Question</source> - <translation type="unfinished"></translation> + <translation>Pergunta Pandora</translation> </message> <message> <location filename="../mainUI.cpp" line="659"/> <source>Pandora Error</source> - <translation type="unfinished"></translation> + <translation>Erro Pandora</translation> </message> </context> <context> @@ -359,7 +360,7 @@ <message> <location filename="../PianoBarProcess.cpp" line="358"/> <source>Could not find any matches. Please try a different search term</source> - <translation type="unfinished"></translation> + <translation>Não foi possível encontrar nenhum resultado. Experimente um termo de pesquisa diferente</translation> </message> </context> <context> @@ -367,67 +368,67 @@ <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="608"/> <source>Multimedia</source> - <translation type="unfinished"></translation> + <translation>Multimídia</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="609"/> <source>Development</source> - <translation type="unfinished"></translation> + <translation>Desenvolvimento</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="610"/> <source>Education</source> - <translation type="unfinished"></translation> + <translation>Educação</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="611"/> <source>Games</source> - <translation type="unfinished"></translation> + <translation>Jogos</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="612"/> <source>Graphics</source> - <translation type="unfinished"></translation> + <translation>Gráficos</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="613"/> <source>Network</source> - <translation type="unfinished"></translation> + <translation>Rede</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="614"/> <source>Office</source> - <translation type="unfinished"></translation> + <translation>Escritório</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="615"/> <source>Science</source> - <translation type="unfinished"></translation> + <translation>Ciência</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="616"/> <source>Settings</source> - <translation type="unfinished"></translation> + <translation>Configurações</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="617"/> <source>System</source> - <translation type="unfinished"></translation> + <translation>Sistema</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="618"/> <source>Utility</source> - <translation type="unfinished"></translation> + <translation>Utilitários</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="619"/> <source>Wine</source> - <translation type="unfinished"></translation> + <translation>Wine</translation> </message> <message> <location filename="../../../core/libLumina/LuminaXDG.cpp" line="620"/> <source>Unsorted</source> - <translation type="unfinished"></translation> + <translation>Não classificado</translation> </message> </context> </TS> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_ru.ts b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_ru.ts index 0664622c..364ffb87 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_ru.ts +++ b/src-qt5/desktop-utils/lumina-mediaplayer/i18n/l-mediap_ru.ts @@ -114,12 +114,12 @@ <message> <location filename="../mainUI.ui" line="527"/> <source>Email</source> - <translation type="unfinished"></translation> + <translation>Эл.почта</translation> </message> <message> <location filename="../mainUI.ui" line="537"/> <source>Password</source> - <translation type="unfinished"></translation> + <translation>Пароль</translation> </message> <message> <location filename="../mainUI.ui" line="557"/> @@ -154,7 +154,7 @@ <message> <location filename="../mainUI.ui" line="681"/> <source>File</source> - <translation type="unfinished"></translation> + <translation>Файл</translation> </message> <message> <location filename="../mainUI.ui" line="688"/> @@ -164,17 +164,17 @@ <message> <location filename="../mainUI.ui" line="723"/> <source>Play</source> - <translation type="unfinished"></translation> + <translation>Пуск</translation> </message> <message> <location filename="../mainUI.ui" line="728"/> <source>Pause</source> - <translation type="unfinished"></translation> + <translation>Пауза</translation> </message> <message> <location filename="../mainUI.ui" line="733"/> <source>Stop</source> - <translation type="unfinished"></translation> + <translation>Стоп</translation> </message> <message> <location filename="../mainUI.ui" line="738"/> @@ -189,7 +189,7 @@ <message> <location filename="../mainUI.ui" line="748"/> <source>VolUp</source> - <translation type="unfinished"></translation> + <translation>Громче</translation> </message> <message> <location filename="../mainUI.ui" line="751"/> @@ -199,7 +199,7 @@ <message> <location filename="../mainUI.ui" line="756"/> <source>VolDown</source> - <translation type="unfinished"></translation> + <translation>Тише</translation> </message> <message> <location filename="../mainUI.ui" line="759"/> @@ -310,7 +310,7 @@ <message> <location filename="../mainUI.cpp" line="406"/> <source>Now Playing:</source> - <translation type="unfinished"></translation> + <translation>Воспроизводится:</translation> </message> <message> <location filename="../mainUI.cpp" line="471"/> @@ -341,7 +341,7 @@ <message> <location filename="../mainUI.cpp" line="576"/> <source>Search Term</source> - <translation type="unfinished"></translation> + <translation>Что искать</translation> </message> <message> <location filename="../mainUI.cpp" line="654"/> @@ -359,7 +359,7 @@ <message> <location filename="../PianoBarProcess.cpp" line="358"/> <source>Could not find any matches. Please try a different search term</source> - <translation type="unfinished"></translation> + <translation>Совпадений не найдено. Попробуйте поискать что-то другое</translation> </message> </context> <context> diff --git a/src-qt5/desktop-utils/lumina-mediaplayer/lumina-mediaplayer.pro b/src-qt5/desktop-utils/lumina-mediaplayer/lumina-mediaplayer.pro index c9ea6a5b..d7423485 100644 --- a/src-qt5/desktop-utils/lumina-mediaplayer/lumina-mediaplayer.pro +++ b/src-qt5/desktop-utils/lumina-mediaplayer/lumina-mediaplayer.pro @@ -90,7 +90,7 @@ TRANSLATIONS = i18n/l-mediap_af.ts \ i18n/l-mediap_zu.ts dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ -dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ desktop.files=lumina-mediaplayer.desktop desktop.path=$${L_SHAREDIR}/applications/ @@ -99,7 +99,7 @@ desktop.path=$${L_SHAREDIR}/applications/ #link.extra=ln -sf lumina-mediaplayer $(INSTALL_ROOT)$${L_BINDIR}/lplay manpage.path=$${L_MANDIR}/man1/ -manpage.extra="$${MAN_ZIP} lumina-mediaplayer.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-mediaplayer.1.gz" +manpage.extra="$${MAN_ZIP} $$PWD/lumina-mediaplayer.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-mediaplayer.1.gz" INSTALLS += target desktop manpage diff --git a/src-qt5/desktop-utils/lumina-pdf/PresentationLabel.h b/src-qt5/desktop-utils/lumina-pdf/PresentationLabel.h new file mode 100644 index 00000000..c5b552a6 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-pdf/PresentationLabel.h @@ -0,0 +1,35 @@ +//=========================================== +// Lumina Desktop source code +// Copyright (c) 2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// Simple subclass of QLabel to provide +// some overlay information as a presentation window +//=========================================== +#ifndef _PRESENTATION_LABEL_WIDGET_H +#define _PRESENTATION_LABEL_WIDGET_H + +#include <QLabel> +#include <QMouseEvent> +#include <QDebug> + +class PresentationLabel : public QLabel{ + Q_OBJECT + +signals: + void nextSlide(); + +public: + PresentationLabel() : QLabel(0, Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint){ + this->setContextMenuPolicy(Qt::CustomContextMenu); + } + +protected: + void mousePressEvent(QMouseEvent *ev){ + QLabel::mousePressEvent(ev); + if(ev->button()==Qt::LeftButton){ emit nextSlide(); } + } +}; + +#endif diff --git a/src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp b/src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp new file mode 100644 index 00000000..be00e675 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp @@ -0,0 +1,279 @@ +#include "PrintWidget.h" + +PrintWidget::PrintWidget(QWidget *parent) : QGraphicsView(parent), scene(0), curPage(1), + viewMode(SinglePageView), zoomMode(FitInView), zoomFactor(1), initialized(false), fitting(true) { + + this->setMouseTracking(true); + QList<QWidget*> children = this->findChildren<QWidget*>("",Qt::FindChildrenRecursively); + for(int i=0; i<children.length(); i++){ + children[i]->setContextMenuPolicy(Qt::CustomContextMenu); + connect(children[i], SIGNAL(customContextMenuRequested(const QPoint&)), this, SIGNAL(customContextMenuRequested(const QPoint&)) ); + } + this->setInteractive(false); + this->setDragMode(QGraphicsView::ScrollHandDrag); + this->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); + this->setFocusPolicy(Qt::NoFocus); + QObject::connect(this->verticalScrollBar(), SIGNAL(valueChanged(int)), + this, SLOT(updateCurrentPage())); + QObject::connect(this, SIGNAL(resized()), this, SLOT(fit())); + + scene = new QGraphicsScene(this); + scene->setBackgroundBrush(Qt::gray); + this->setScene(scene); + + /*QVBoxLayout *layout = new QVBoxLayout; + setLayout(layout); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(this);*/ +} + +PrintWidget::~PrintWidget() { + //delete scene; + //delete items in pages(?) +} + +//Public Slots + +void PrintWidget::fitView() { + setZoomMode(FitInView); +} + +void PrintWidget::fitToWidth() { + setZoomMode(FitToWidth); +} + +void PrintWidget::setZoomMode(ZoomMode mode) { + zoomMode = mode; + fitting = true; + fit(true); +} + +void PrintWidget::setAllPagesViewMode() { + setViewMode(AllPagesView); +} + +void PrintWidget::setSinglePageViewMode() { + setViewMode(SinglePageView); +} + +void PrintWidget::setFacingPagesViewMode() { + setViewMode(FacingPagesView); +} + +void PrintWidget::setViewMode(ViewMode mode) { + viewMode = mode; + layoutPages(); + if (viewMode == AllPagesView) { + this->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio); + fitting = false; + zoomMode = CustomZoom; + //zoomFactor = this->transform().m11() * (double(printer->logicalDpiY()) / logicalDpiY()); + } else { + fitting = true; + fit(); + } +} + +void PrintWidget::zoomIn(double factor) { + fitting = false; + zoomMode = CustomZoom; + zoomFactor *= factor; + this->scale(factor, factor); +} + +void PrintWidget::zoomOut(double factor) { + fitting = false; + zoomMode = CustomZoom; + zoomFactor *= factor; + this->scale(1/factor, 1/factor); +} + +void PrintWidget::updatePreview() { + initialized = true; + generatePreview(); + this->updateGeometry(); +} + +void PrintWidget::setVisible(bool visible) { + if(visible and !initialized) + updatePreview(); + QGraphicsView::setVisible(visible); +} + +void PrintWidget::setCurrentPage(int pageNumber) { + if(pageNumber < 1 || pageNumber > pages.count()) + return; + + int lastPage = curPage; + curPage = pageNumber; + + if (lastPage != curPage && lastPage > 0 && lastPage <= pages.count()) { + if (zoomMode != FitInView) { + QScrollBar *hsc = this->horizontalScrollBar(); + QScrollBar *vsc = this->verticalScrollBar(); + QPointF pt = this->transform().map(pages.at(curPage-1)->pos()); + vsc->setValue(int(pt.y()) - 10); + hsc->setValue(int(pt.x()) - 10); + } else { + this->centerOn(pages.at(curPage-1)); + } + } +} + +void PrintWidget::highlightText(int pageNum, QRectF textBox) { + PageItem *item = static_cast<PageItem*>(pages[pageNum]); + QPainter painter(this); + painter.fillRect(textBox, QColor(255, 255, 177, 128)); +} + +//Private functions + +void PrintWidget::generatePreview() { + populateScene(); // i.e. setPreviewPrintedPictures() e.l. + layoutPages(); + curPage = qBound(1, curPage, pages.count()); + if (fitting) + fit(); +} + +void PrintWidget::layoutPages() { + int numPages = pages.count(); + if (numPages < 1) + return; + + int numPagePlaces = numPages; + int cols = 1; // singleMode and default + if (viewMode == AllPagesView) { + cols = ((pictures->value(0)).width() > (pictures->value(0)).height()) ? qFloor(qSqrt(numPages)) : qCeil(qSqrt(numPages)); + cols += cols % 2; // Nicer with an even number of cols + } else if (viewMode == FacingPagesView) { + cols = 2; + numPagePlaces += 1; + } + int rows = qCeil(double(numPagePlaces) / cols); + + double itemWidth = pages.at(0)->boundingRect().width(); + double itemHeight = pages.at(0)->boundingRect().height(); + int pageNum = 1; for (int i = 0; i < rows && pageNum <= numPages; i++) { + for (int j = 0; j < cols && pageNum <= numPages; j++) { + if (!i && !j && viewMode == FacingPagesView) { + continue; + } else { + pages.at(pageNum-1)->setPos(QPointF(j*itemWidth, i*itemHeight)); + pageNum++; + } + } + } + scene->setSceneRect(scene->itemsBoundingRect()); +} + +void PrintWidget::populateScene() +{ + for (int i = 0; i < pages.size(); i++) + scene->removeItem(pages.at(i)); + qDeleteAll(pages); + pages.clear(); + + int numPages = pictures->count(); + //Replace from loadingHash resolution + QSize paperSize = pictures->value(0).size(); + qDebug() << "Image paperSize" << paperSize; + + for (int i = 0; i < numPages; i++) { + PageItem* item = new PageItem(i+1, (*pictures)[i], paperSize); + scene->addItem(item); + pages.append(item); + } +} + +//Private Slots +void PrintWidget::updateCurrentPage() { + if (viewMode == AllPagesView) + return; + + int newPage = calcCurrentPage(); + if (newPage != curPage) { + curPage = newPage; + } +} + +int PrintWidget::calcCurrentPage() { + int maxArea = 0; + int newPage = curPage; + QRect viewRect = this->viewport()->rect(); + QList<QGraphicsItem*> items = this->items(viewRect); + for (int i=0; i<items.size(); ++i) { + PageItem* pg = static_cast<PageItem*>(items.at(i)); + QRect overlap = this->mapFromScene(pg->sceneBoundingRect()).boundingRect() & viewRect; + int area = overlap.width() * overlap.height(); + if (area > maxArea) { + maxArea = area; + newPage = pg->pageNumber(); + } else if (area == maxArea && pg->pageNumber() < newPage) { + newPage = pg->pageNumber(); + } + } + return newPage; +} + +void PrintWidget::fit(bool doFitting) { + if (curPage < 1 || curPage > pages.count()) + return; + if (!doFitting && !fitting) + return; + + if (doFitting && fitting) { + QRect viewRect = this->viewport()->rect(); + if (zoomMode == FitInView) { + QList<QGraphicsItem*> containedItems = this->items(viewRect, Qt::ContainsItemBoundingRect); + foreach(QGraphicsItem* item, containedItems) { + PageItem* pg = static_cast<PageItem*>(item); + if (pg->pageNumber() == curPage) + return; + } + } + + int newPage = calcCurrentPage(); + if (newPage != curPage) + curPage = newPage; + } + + QRectF target = pages.at(curPage-1)->sceneBoundingRect(); + if (viewMode == FacingPagesView) { + if (curPage % 2) + target.setLeft(target.left() - target.width()); + else + target.setRight(target.right() + target.width()); + } else if (viewMode == AllPagesView) { + target = scene->itemsBoundingRect(); + } + + if (zoomMode == FitToWidth) { + QTransform t; + qreal scale = this->viewport()->width() / target.width(); + t.scale(scale, scale); + this->setTransform(t); + if (doFitting && fitting) { + QRectF viewSceneRect = this->viewportTransform().mapRect(this->viewport()->rect()); + viewSceneRect.moveTop(target.top()); + this->ensureVisible(viewSceneRect); // Nah... + } + } else { + this->fitInView(target, Qt::KeepAspectRatio); + if (zoomMode == FitInView) { + int step = qRound(this->matrix().mapRect(target).height()); + this->verticalScrollBar()->setSingleStep(step); + this->verticalScrollBar()->setPageStep(step); + } + } + + //zoomFactor = this->transform().m11() * (float(printer->logicalDpiY()) / this->logicalDpiY()); +} + +void PrintWidget::setPictures(QHash<int, QImage> *hash) { + pictures = hash; +} + +void PrintWidget::setOrientation(QPageLayout::Orientation ori) { + this->orientation = ori; +} diff --git a/src-qt5/desktop-utils/lumina-pdf/PrintWidget.h b/src-qt5/desktop-utils/lumina-pdf/PrintWidget.h new file mode 100644 index 00000000..62543e45 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-pdf/PrintWidget.h @@ -0,0 +1,164 @@ +//=========================================== +// Lumina Desktop source code +// Copyright (c) 2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// Simple subclass of QPrintPreviewWidget to provide +// notification when a context menu is requested +//=========================================== +#ifndef _PRINT_GRAPHICS_H +#define _PRINT_GRAPHICS_H + +#include <QMouseEvent> +#include <QDebug> +#include <QGraphicsView> +#include <QGraphicsItem> +#include <QBoxLayout> +#include <QScrollBar> +#include <QStyleOptionGraphicsItem> +#include <QtMath> +#include <QPageLayout> + +namespace { +class PageItem : public QGraphicsItem +{ +public: + PageItem(int _pageNum, const QImage _pagePicture, QSize _paperSize) + : pageNum(_pageNum), pagePicture(_pagePicture), + paperSize(_paperSize) + { + brect = QRectF(QPointF(-25, -25), + QSizeF(paperSize)+QSizeF(50, 50)); + setCacheMode(DeviceCoordinateCache); + } + + QRectF boundingRect() const Q_DECL_OVERRIDE + { return brect; } + + inline int pageNumber() const + { return pageNum; } + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget) Q_DECL_OVERRIDE; + +private: + int pageNum; + const QImage pagePicture; + QSize paperSize; + QRectF brect; +}; + +void PageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(widget); + QRectF paperRect(0,0, paperSize.width(), paperSize.height()); + + // Draw shadow + painter->setClipRect(option->exposedRect); + qreal shWidth = paperRect.width()/100; + QRectF rshadow(paperRect.topRight() + QPointF(0, shWidth), + paperRect.bottomRight() + QPointF(shWidth, 0)); + QLinearGradient rgrad(rshadow.topLeft(), rshadow.topRight()); + rgrad.setColorAt(0.0, QColor(0,0,0,255)); + rgrad.setColorAt(1.0, QColor(0,0,0,0)); + painter->fillRect(rshadow, QBrush(rgrad)); + QRectF bshadow(paperRect.bottomLeft() + QPointF(shWidth, 0), + paperRect.bottomRight() + QPointF(0, shWidth)); + QLinearGradient bgrad(bshadow.topLeft(), bshadow.bottomLeft()); + bgrad.setColorAt(0.0, QColor(0,0,0,255)); + bgrad.setColorAt(1.0, QColor(0,0,0,0)); + painter->fillRect(bshadow, QBrush(bgrad)); + QRectF cshadow(paperRect.bottomRight(), + paperRect.bottomRight() + QPointF(shWidth, shWidth)); + QRadialGradient cgrad(cshadow.topLeft(), shWidth, cshadow.topLeft()); + cgrad.setColorAt(0.0, QColor(0,0,0,255)); + cgrad.setColorAt(1.0, QColor(0,0,0,0)); + painter->fillRect(cshadow, QBrush(cgrad)); + + painter->setClipRect(paperRect & option->exposedRect); + painter->fillRect(paperRect, Qt::white); + if (pagePicture.isNull()){ + qDebug() << "NULL"; + return; + } + painter->drawImage(QPoint(0,0), pagePicture); +} +} + +class PrintWidget : public QGraphicsView +{ + Q_OBJECT +public: + PrintWidget(QWidget *parent = 0); + ~PrintWidget(); + enum ViewMode { + SinglePageView, + FacingPagesView, + AllPagesView + }; + + enum ZoomMode { + CustomZoom, + FitToWidth, + FitInView + }; + + double getZoomFactor() const { return this->zoomFactor; }; + ZoomMode getZoomMode() const { return this->zoomMode; }; + int currentPage() const { return curPage; }; + void setPictures(QHash<int, QImage>*); + +signals: + void resized(); + void customContextMenuRequested(const QPoint&); +public slots: + void zoomIn(double factor=1.2); + void zoomOut(double factor=1.2); + void setCurrentPage(int); + void setVisible(bool) Q_DECL_OVERRIDE; + void setOrientation(QPageLayout::Orientation); + void highlightText(int, QRectF); + + void updatePreview(); + void fitView(); + void fitToWidth(); + void setAllPagesViewMode(); + void setSinglePageViewMode(); + void setFacingPagesViewMode(); + +private slots: + void updateCurrentPage(); + int calcCurrentPage(); + void fit(bool doFitting=false); +protected: + void resizeEvent(QResizeEvent* e) Q_DECL_OVERRIDE { + /*{ + const QSignalBlocker blocker(verticalScrollBar()); // Don't change page, QTBUG-14517 + QGraphicsView::resizeEvent(e); + }*/ + QGraphicsView::resizeEvent(e); + emit resized(); + } + + void showEvent(QShowEvent* e) Q_DECL_OVERRIDE { + QGraphicsView::showEvent(e); + emit resized(); + } +private: + void generatePreview(); + void layoutPages(); + void populateScene(); + void setViewMode(ViewMode); + void setZoomMode(ZoomMode); + QGraphicsScene *scene; + + int curPage; + ViewMode viewMode; + ZoomMode zoomMode; + QPageLayout::Orientation orientation; + double zoomFactor; + bool initialized, fitting; + QList<QGraphicsItem*> pages; + QHash<int, QImage> *pictures; +}; +#endif diff --git a/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro b/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro index e17e59c5..8ee67d06 100644 --- a/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro +++ b/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro @@ -18,14 +18,19 @@ include(../../core/libLumina/LuminaXDG.pri) message("Qt Modules Needed: $${QT}") SOURCES += main.cpp \ - mainUI.cpp + mainUI.cpp \ + propDialog.cpp \ + PrintWidget.cpp -HEADERS += mainUI.h +HEADERS += mainUI.h \ + PrintWidget.h \ + PresentationLabel.h \ + PropDialog.h -FORMS += mainUI.ui +FORMS += mainUI.ui \ + propDialog.ui LIBS += -lpoppler-qt5 -INCLUDEPATH+= $${L_INCLUDEDIR}/poppler/qt5 TRANSLATIONS = i18n/l-pdf_af.ts \ i18n/l-pdf_ar.ts \ @@ -95,7 +100,7 @@ TRANSLATIONS = i18n/l-pdf_af.ts \ i18n/l-pdf_zu.ts dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ -dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ desktop.files=lumina-pdf.desktop desktop.path=$${L_SHAREDIR}/applications/ diff --git a/src-qt5/desktop-utils/lumina-pdf/mainUI.cpp b/src-qt5/desktop-utils/lumina-pdf/mainUI.cpp index 7a310e85..57afbfe1 100644 --- a/src-qt5/desktop-utils/lumina-pdf/mainUI.cpp +++ b/src-qt5/desktop-utils/lumina-pdf/mainUI.cpp @@ -16,21 +16,24 @@ #include <QApplication> #include <QScreen> #include <QTimer> +#include <iostream> #include <QtConcurrent> #include <LuminaXDG.h> +#include "PrintWidget.h" MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI()){ ui->setupUi(this); - presentationLabel = 0; this->setWindowTitle(tr("Lumina PDF Viewer")); this->setWindowIcon( LXDG::findIcon("application-pdf","unknown")); - CurrentPage = 0; + presentationLabel = 0; + CurrentPage = 1; lastdir = QDir::homePath(); - Printer = new QPrinter(); //Create the interface widgets - WIDGET = new QPrintPreviewWidget(Printer,this); + WIDGET = new PrintWidget(this); + WIDGET->setVisible(false); + WIDGET->setContextMenuPolicy(Qt::CustomContextMenu); clockTimer = new QTimer(this); clockTimer->setInterval(1000); //1-second updates to clock connect(clockTimer, SIGNAL(timeout()), this, SLOT(updateClock()) ); @@ -39,15 +42,22 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI()){ label_clock->setAlignment(Qt::AlignCenter ); label_clock->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); label_clock->setStyleSheet("QLabel{color: palette(highlight-text); background-color: palette(highlight); border-radius: 5px; }"); + //Context Menu + contextMenu = new QMenu(this); + connect(contextMenu, SIGNAL(aboutToShow()), this, SLOT(updateContextMenu())); //Now put the widgets into the UI + ui->bookmarksFrame->setParent(WIDGET); + ui->findGroup->setParent(WIDGET); + qDebug() << "Setting central widget"; this->setCentralWidget(WIDGET); - connect(WIDGET, SIGNAL(paintRequested(QPrinter*)), this, SLOT(paintOnWidget(QPrinter*)) ); + WIDGET->setContextMenuPolicy(Qt::CustomContextMenu); + connect(WIDGET, SIGNAL(customContextMenuRequested(const QPoint&)),this, SLOT(showContextMenu(const QPoint&)) ); DOC = 0; connect(this, SIGNAL(PageLoaded(int)), this, SLOT(slotPageLoaded(int)) ); PrintDLG = new QPrintDialog(this); connect(PrintDLG, SIGNAL(accepted(QPrinter*)), this, SLOT(paintToPrinter(QPrinter*)) ); - connect(ui->menuStart_Presentation, SIGNAL(triggered(QAction*)), this, SLOT(slotStartPresentation(QAction*)) ); + //connect(ui->menuStart_Presentation, SIGNAL(triggered(QAction*)), this, SLOT(slotStartPresentation(QAction*)) ); //Create the other interface widgets progress = new QProgressBar(this); @@ -57,6 +67,7 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI()){ progAct->setVisible(false); clockAct = ui->toolBar->addWidget(label_clock); clockAct->setVisible(false); + //Put the various actions into logical groups QActionGroup *tmp = new QActionGroup(this); tmp->setExclusive(true); @@ -71,15 +82,66 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI()){ tmp->addAction(ui->actionAll_Pages); ui->actionSingle_Page->setChecked(true); + qDebug() << "Starting connections"; + //Connect up the buttons connect(ui->actionClose, SIGNAL(triggered()), this, SLOT(close()) ); connect(ui->actionPrint, SIGNAL(triggered()), PrintDLG, SLOT(open()) ); connect(ui->actionFit_Width, SIGNAL(triggered()), WIDGET, SLOT(fitToWidth()) ); - connect(ui->actionFit_Page, SIGNAL(triggered()), WIDGET, SLOT(fitInView()) ); + connect(ui->actionFit_Page, SIGNAL(triggered()), WIDGET, SLOT(fitView()) ); connect(ui->actionOpen_PDF, SIGNAL(triggered()), this, SLOT(OpenNewFile()) ); connect(ui->actionSingle_Page, SIGNAL(triggered()), WIDGET, SLOT(setSinglePageViewMode()) ); connect(ui->actionDual_Pages, SIGNAL(triggered()), WIDGET, SLOT(setFacingPagesViewMode()) ); connect(ui->actionAll_Pages, SIGNAL(triggered()), WIDGET, SLOT(setAllPagesViewMode()) ); + //connect(ui->actionScroll_Mode, &QAction::triggered, this, [&] { this->setScroll(true); }); + //connect(ui->actionSelect_Mode, &QAction::triggered, this, [&] { this->setScroll(false); }); + connect(ui->actionZoom_In, &QAction::triggered, WIDGET, [&] { WIDGET->zoomIn(1.2); }); + connect(ui->actionZoom_Out, &QAction::triggered, WIDGET, [&] { WIDGET->zoomOut(1.2); }); + connect(ui->actionRotate_Counterclockwise, &QAction::triggered, this, [&] { this->rotate(true); }); + connect(ui->actionRotate_Clockwise, &QAction::triggered, this, [&] { this->rotate(false); }); + connect(ui->actionZoom_In_2, &QAction::triggered, WIDGET, [&] { WIDGET->zoomIn(1.2); }); + connect(ui->actionZoom_Out_2, &QAction::triggered, WIDGET, [&] { WIDGET->zoomOut(1.2); }); + connect(ui->actionFirst_Page, SIGNAL(triggered()), this, SLOT(firstPage()) ); + connect(ui->actionPrevious_Page, SIGNAL(triggered()), this, SLOT(prevPage()) ); + connect(ui->actionNext_Page, SIGNAL(triggered()), this, SLOT(nextPage()) ); + connect(ui->actionLast_Page, SIGNAL(triggered()), this, SLOT(lastPage()) ); + connect(ui->actionProperties, SIGNAL(triggered()), this, SLOT(showInformation())); + connect(ui->actionFind, SIGNAL(triggered()), this, SLOT(enableFind())); + connect(ui->actionFind_Next, &QAction::triggered, this, + [&] { find(ui->textEdit->text(), true); }); + connect(ui->actionFind_Previous, &QAction::triggered, this, + [&] { find(ui->textEdit->text(), false); }); + connect(ui->findNextB, &QPushButton::clicked, this, + [&] { find(ui->textEdit->text(), true); }); + connect(ui->findPrevB, &QPushButton::clicked, this, + [&] { find(ui->textEdit->text(), false); }); + connect(ui->matchCase, &QPushButton::clicked, this, + [&] (bool value) { this->matchCase = value; }); + connect(ui->closeFind, &QPushButton::clicked, this, + [&] { ui->findGroup->setVisible(false); this->setFocus(); }); + connect(ui->actionClearHighlights, &QAction::triggered, WIDGET, + [&] { WIDGET->updatePreview(); }); + connect(ui->actionBookmarks, SIGNAL(triggered()), this, SLOT(showBookmarks())); + + qDebug() << "Finished connctions"; + + //int curP = WIDGET->currentPage()-1; //currentPage reports pages starting at 1 + //int lastP = numPages-1; + ui->actionFirst_Page->setText(tr("First Page")); + ui->actionPrevious_Page->setText(tr("Previous Page")); + ui->actionNext_Page->setText(tr("Next Page")); + ui->actionLast_Page->setText(tr("Last Page")); + /*ui->actionFirst_Page->setEnabled(curP!=0); + ui->actionPrevious_Page->setEnabled(curP>0); + ui->actionNext_Page->setEnabled(curP<lastP); + ui->actionLast_Page->setEnabled(curP!=lastP);*/ + + ui->actionStart_Here->setText(tr("Start Presentation (current slide)")); + connect(ui->actionStart_Here, SIGNAL(triggered()), this, SLOT(startPresentationHere()) ); + ui->actionStart_Begin->setText(tr("Start Presentation (at beginning)")); + connect(ui->actionStart_Begin, SIGNAL(triggered()), this, SLOT(startPresentationBeginning()) ); + ui->actionStop_Presentation->setText(tr("Stop Presentation")); + connect(ui->actionStop_Presentation, SIGNAL(triggered()), this, SLOT(closePresentation()) ); //Setup all the icons ui->actionPrint->setIcon( LXDG::findIcon("document-print","")); @@ -90,10 +152,41 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI()){ ui->actionSingle_Page->setIcon(LXDG::findIcon("format-view-agenda","")); ui->actionDual_Pages->setIcon(LXDG::findIcon("format-view-grid-small","")); ui->actionAll_Pages->setIcon(LXDG::findIcon("format-view-grid-large","")); + ui->actionScroll_Mode->setIcon(LXDG::findIcon("cursor-pointer","")); + ui->actionSelect_Mode->setIcon(LXDG::findIcon("cursor-text","")); + ui->actionZoom_In->setIcon(LXDG::findIcon("zoom-in","")); + ui->actionZoom_Out->setIcon(LXDG::findIcon("zoom-out","")); + ui->actionZoom_In_2->setIcon(LXDG::findIcon("zoom-in","")); + ui->actionZoom_Out_2->setIcon(LXDG::findIcon("zoom-out","")); + ui->actionRotate_Counterclockwise->setIcon(LXDG::findIcon("object-rotate-left","")); + ui->actionRotate_Clockwise->setIcon(LXDG::findIcon("object-rotate-right","")); + ui->actionFirst_Page->setIcon(LXDG::findIcon("go-first","")); + ui->actionPrevious_Page->setIcon(LXDG::findIcon("go-previous","")); + ui->actionNext_Page->setIcon(LXDG::findIcon("go-next","")); + ui->actionLast_Page->setIcon(LXDG::findIcon("go-last","")); + ui->actionStart_Here->setIcon(LXDG::findIcon("media-playback-start-circled","")); + ui->actionStart_Begin->setIcon(LXDG::findIcon("presentation-play","")); + ui->actionStop_Presentation->setIcon(LXDG::findIcon("media-playback-stop-circled","")); + ui->actionBookmarks->setIcon(LXDG::findIcon("bookmark-new","")); + ui->actionFind->setIcon(LXDG::findIcon("edit-find","")); + ui->actionFind_Next->setIcon(LXDG::findIcon("edit-find-next","")); + ui->actionFind_Previous->setIcon(LXDG::findIcon("edit-find-prev","")); + ui->actionProperties->setIcon(LXDG::findIcon("dialog-information","")); + ui->actionSettings->setIcon(LXDG::findIcon("document-properties","")); + ui->findNextB->setIcon(LXDG::findIcon("go-down-search")); + ui->findPrevB->setIcon(LXDG::findIcon("go-up-search")); + ui->matchCase->setIcon(LXDG::findIcon("format-text-italic")); + ui->closeFind->setIcon(LXDG::findIcon("dialog-close")); + + qDebug() << "Finished setting icons"; //Now set the default state of the menu's and actions - ui->menuStart_Presentation->setEnabled(false); ui->actionStop_Presentation->setEnabled(false); + ui->actionStart_Here->setEnabled(false); + ui->actionStart_Begin->setEnabled(false); + + ui->findGroup->setVisible(false); + ui->bookmarksFrame->setVisible(false); } MainUI::~MainUI(){ @@ -101,8 +194,8 @@ MainUI::~MainUI(){ } void MainUI::loadFile(QString path){ - if(!QFile::exists(path) || path.isEmpty() ){ return; } + Poppler::Document *TDOC = Poppler::Document::load(path); if(TDOC==0){ qDebug() << "Could not open file:" << path; @@ -116,44 +209,56 @@ void MainUI::loadFile(QString path){ } if(TDOC->isLocked()){ return; } //Cancelled - still locked } + //qpdf.processFile(path.toLatin1().data(), pass.toLatin1().data()); if(DOC!=0){ //Clear out the old document first delete DOC; DOC=0; } - loadingHash.clear(); //clear out this hash + //loadingHash.clear(); //clear out this hash numPages = -1; DOC = TDOC; //Save this for later qDebug() << "Opening File:" << path; - this->setWindowTitle(DOC->title()); + this->setWindowTitle(TDOC->title()); if(this->windowTitle().isEmpty()){ this->setWindowTitle(path.section("/",-1)); } //Setup the Document + //QVector<QPDFObjectHandle> pages = (QVector<QPDFObjectHandle>)pdf.getAllPages(); + //QPDFObjectHandle page = pages.at(0); Poppler::Page *PAGE = DOC->page(0); if(PAGE!=0){ lastdir = path.section("/",0,-2); //save this for later - Printer->setPageSize( QPageSize(PAGE->pageSize(), QPageSize::Point) ); - Printer->setPageMargins(QMarginsF(0,0,0,0), QPageLayout::Point); switch(PAGE->orientation()){ - case Poppler::Page::Landscape: - Printer->setOrientation(QPrinter::Landscape); break; - default: - Printer->setOrientation(QPrinter::Portrait); + case Poppler::Page::Landscape: + WIDGET->setOrientation(QPageLayout::Landscape); break; + default: + WIDGET->setOrientation(QPageLayout::Portrait); } delete PAGE; - //qDebug() << " - Document Setup : start loading pages now"; - QTimer::singleShot(10, WIDGET, SLOT(updatePreview())); //start loading the file preview + qDebug() << " - Document Setup : start loading pages now"; + startLoadingPages(); + //QTimer::singleShot(10, WIDGET, SLOT(updatePreview())); //start loading the file preview } } void MainUI::loadPage(int num, Poppler::Document *doc, MainUI *obj, QSize dpi, QSizeF page){ + //PERFORMANCE NOTES: + // Using Poppler to scale the image (adjust dpi value) helps a bit but you take a large CPU loading hit (and still quite a lot of pixelization) + // Using Qt to scale the image (adjust page value) smooths out the image quite a bit without a lot of performance loss (but cannot scale up without pixelization) + // The best approach seams to be to increase the DPI a bit, but match that with the same scaling on the page size (smoothing) + //qDebug() << " - Render Page:" << num; Poppler::Page *PAGE = doc->page(num); if(PAGE!=0){ - //qDebug() << "DPI:" << 4*dpi; - loadingHash.insert(num, PAGE->renderToImage(2.5*dpi.width(), 2.5*dpi.height()).scaled(2*page.width(), 2*page.height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation) ); + //qDebug() << "DPI:" << dpi << "Size:" << page << "Page Size (pt):" << PAGE->pageSize(); + float scalefactor = (dpi.width()/72.0); //How different the screen DPI compares to standard page DPI + //qDebug() << "Scale Factor:" << scalefactor; + QImage raw = PAGE->renderToImage((scalefactor+0.2)*dpi.width(), (scalefactor+0.2)*dpi.height()); //make the raw image a tiny bit larger than the end result + //qDebug() << " - Raw Image Size:" << raw.size(); + loadingHash.insert(num, raw.scaled(scalefactor*page.width(), scalefactor*page.height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation) ); + raw = QImage(); //clear it /* QList<Annotation*> anno = PAGE->annotations(Annotations::AText ); QStringList annoS; @@ -212,16 +317,20 @@ void MainUI::startPresentation(bool atStart){ //Now create the full-screen window on the selected screen if(presentationLabel == 0){ //Create the label and any special flags for it - presentationLabel = new QLabel(0, Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); + presentationLabel = new PresentationLabel(); presentationLabel->setStyleSheet("background-color: black;"); presentationLabel->setAlignment(Qt::AlignCenter); + presentationLabel->setContextMenuPolicy(Qt::CustomContextMenu); + connect(presentationLabel, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&)) ); + connect(presentationLabel, SIGNAL(nextSlide()), this, SLOT(nextPage()) ); } //Now put the label in the proper location presentationLabel->setGeometry(screen->geometry()); presentationLabel->showFullScreen(); ui->actionStop_Presentation->setEnabled(true); - ui->menuStart_Presentation->setEnabled(false); + ui->actionStart_Here->setEnabled(false); + ui->actionStart_Begin->setEnabled(false); updateClock(); clockAct->setVisible(true); clockTimer->start(); @@ -238,7 +347,7 @@ void MainUI::ShowPage(int page){ endPresentation(); return; //invalid - no document loaded or invalid page specified } - WIDGET->setCurrentPage(page+1); //page numbers start at 1 for this widget + WIDGET->setCurrentPage(page); //page numbers start at 1 for this widget //Stop here if no presentation currently running if(presentationLabel == 0 || !presentationLabel->isVisible()){ return; } CurrentPage = page; @@ -261,57 +370,58 @@ void MainUI::endPresentation(){ if(presentationLabel==0 || !presentationLabel->isVisible()){ return; } //not in presentation mode presentationLabel->hide(); //just hide this (no need to re-create the label for future presentations) ui->actionStop_Presentation->setEnabled(false); - ui->menuStart_Presentation->setEnabled(true); + ui->actionStart_Here->setEnabled(true); + ui->actionStart_Begin->setEnabled(true); clockTimer->stop(); clockAct->setVisible(false); this->releaseKeyboard(); } -void MainUI::startLoadingPages(QPrinter *printer){ +void MainUI::startLoadingPages(){ if(numPages>0){ return; } //currently loaded[ing] - //qDebug() << " - Start Loading Pages"; + qDebug() << " - Start Loading Pages"; numPages = DOC->numPages(); //qDebug() << "numPages:" << numPages; progress->setRange(0,numPages); progress->setValue(0); progAct->setVisible(true); - QRectF pageSize = printer->pageRect(QPrinter::DevicePixel); - QSize DPI(printer->resolution(),printer->resolution()); + QSizeF pageSize = DOC->page(0)->pageSizeF()*2; + //QSize DPI(loadingHash[0]->resolution(),loadingHash[0]->resolution()); + QSize DPI(76,76); + /*qDebug() << "Screen Resolutions:"; + QList<QScreen*> screens = QApplication::screens(); + for(int i=0; i<screens.length(); i++){ + qDebug() << screens[i]->name() << screens[i]->logicalDotsPerInchX() << screens[i]->logicalDotsPerInchY(); + }*/ + qDebug() << "Poppler pageSize: " << pageSize; for(int i=0; i<numPages; i++){ //qDebug() << " - Kickoff page load:" << i; - QtConcurrent::run(this, &MainUI::loadPage, i, DOC, this, DPI, pageSize.size() ); + QtConcurrent::run(this, &MainUI::loadPage, i, DOC, this, DPI, pageSize); } } void MainUI::slotPageLoaded(int page){ + Q_UNUSED(page); //qDebug() << "Page Loaded:" << page; int finished = loadingHash.keys().length(); if(finished == numPages){ progAct->setVisible(false); - QTimer::singleShot(0, WIDGET, SLOT(updatePreview())); + qDebug() << "Setting Pictures"; + WIDGET->setPictures(&loadingHash); + WIDGET->setVisible(true); + //QTimer::singleShot(10, WIDGET, SLOT(updatePreview())); + //qDebug() << "Updating"; ui->actionStop_Presentation->setEnabled(false); - ui->menuStart_Presentation->setEnabled(true); + ui->actionStart_Here->setEnabled(true); + ui->actionStart_Begin->setEnabled(true); }else{ progress->setValue(finished); } } -void MainUI::slotStartPresentation(QAction *act){ +/*void MainUI::slotStartPresentation(QAction *act){ startPresentation(act == ui->actionAt_Beginning); -} - -void MainUI::paintOnWidget(QPrinter *PRINTER){ - if(DOC==0){ return; } - //this->show(); - if(loadingHash.keys().length() != numPages){ startLoadingPages(PRINTER); return; } - - QPainter painter(PRINTER); - for(int i=0; i<numPages; i++){ - if(i != 0){ PRINTER->newPage(); } //this is the start of the next page (not needed for first) - if(loadingHash.contains(i)){ painter.drawImage(0,0, loadingHash[i].scaled(PRINTER->pageRect().size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); } - else{ painter.drawImage(0,0, QImage()); } - } -} +}*/ void MainUI::paintToPrinter(QPrinter *PRINTER){ if(loadingHash.keys().length() != numPages){ return; } @@ -320,7 +430,7 @@ void MainUI::paintToPrinter(QPrinter *PRINTER){ int firstpage = 0; int copies = PRINTER->copyCount(); bool collate = PRINTER->collateCopies(); - bool duplex = (PRINTER->duplex()!=QPrinter::DuplexNone); + //bool duplex = (PRINTER->duplex()!=QPrinter::DuplexNone); //Determine the first page that needs to be printed, and the range if((PRINTER->fromPage() != PRINTER->toPage() || PRINTER->fromPage()!=0 ) && PRINTER->printRange()==QPrinter::PageRange ){ firstpage = PRINTER->fromPage() - 1; @@ -350,7 +460,6 @@ void MainUI::paintToPrinter(QPrinter *PRINTER){ } } //qDebug() << "Final Page Range:" << pageCount; - //return; //Generate the sizing information for the printer QSize sz(PRINTER->pageRect().width(), PRINTER->pageRect().height()); bool landscape = PRINTER->orientation()==QPrinter::Landscape; @@ -383,3 +492,166 @@ void MainUI::OpenNewFile(){ void MainUI::updateClock(){ label_clock->setText( QDateTime::currentDateTime().toString("<b>hh:mm:ss</b>") ); } + +void MainUI::setScroll(bool tog) { + if(tog) { + QApplication::setOverrideCursor(Qt::OpenHandCursor); + }else{ + QApplication::setOverrideCursor(Qt::IBeamCursor); + } +} + +void MainUI::rotate(bool ccw) { + for(int i = 0; i < numPages; i++) { + QImage image = loadingHash[i]; + qDebug() << "Page rotating: " << i; + //Setup a rotation matrix that rotates 90 degrees clockwise or counterclockwise + QMatrix matrix = (ccw) ? QMatrix(0, -1, 1, 0, 0, 0) : QMatrix(0, 1, -1, 0, 0, 0); + image = image.transformed(matrix, Qt::SmoothTransformation); + //Updates the image in the hash + loadingHash.insert(i, image); + } + //Rotates the page as well as the image + //WIDGET->setOrientation((WIDGET->orientation() == QPageLayout::Landscape) ? + //QPageLayout::Portrait : QPageLayout::Landscape); + QTimer::singleShot(0, WIDGET, SLOT(updatePreview())); +} + +void MainUI::updateContextMenu(){ + contextMenu->clear(); + contextMenu->addSection( QString(tr("Page %1 of %2")).arg(QString::number(WIDGET->currentPage()), + QString::number(numPages) ) ); + contextMenu->addAction(ui->actionPrevious_Page); + contextMenu->addAction(ui->actionNext_Page); + contextMenu->addSeparator(); + contextMenu->addAction(ui->actionFirst_Page); + contextMenu->addAction(ui->actionLast_Page); + contextMenu->addSeparator(); + if(presentationLabel==0 || !presentationLabel->isVisible()){ + contextMenu->addAction(ui->actionStart_Begin); + contextMenu->addAction(ui->actionStart_Here); + }else{ + contextMenu->addAction(ui->actionStop_Presentation); + } +} + +void MainUI::keyPressEvent(QKeyEvent *event){ + //See if this is one of the special hotkeys and act appropriately + bool inPresentation = (presentationLabel!=0); + if( event->key()==Qt::Key_Escape || event->key()==Qt::Key_Backspace){ + if(inPresentation){ endPresentation(); } + }else if(event->key()==Qt::Key_Right || event->key()==Qt::Key_Space || + event->key()==Qt::Key_PageDown){ + nextPage(); + }else if(event->key()==Qt::Key_Left || event->key()==Qt::Key_PageUp){ + prevPage(); + }else if(event->key()==Qt::Key_Home){ + firstPage(); + }else if(event->key()==Qt::Key_End){ + lastPage(); + }else if(event->key()==Qt::Key_F11){ + if(inPresentation){ endPresentation(); } + else{ startPresentationHere(); } + }else if(event->key() == Qt::Key_Up) { + //Scroll the widget up + }else if(event->key() == Qt::Key_Down) { + //Scroll the widget down + /*qDebug() << "Send Wheel Event"; + QWheelEvent wEvent( WIDGET->mapFromGlobal(QCursor::pos()), QCursor::pos(),QPoint(0,0), QPoint(0,30), 0, Qt::Vertical, Qt::LeftButton, Qt::NoModifier); + QApplication::sendEvent(WIDGET, &wEvent);*/ + }else{ + QMainWindow::keyPressEvent(event); + } +} + +void MainUI::wheelEvent(QWheelEvent *event) { + //Scroll the window according to the mouse wheel + QMainWindow::wheelEvent(event); +} + +void MainUI::showInformation() { + PROPDIALOG = new PropDialog(DOC); + PROPDIALOG->show(); +} + +void MainUI::find(QString text, bool forward) { + if(!text.isEmpty()) { + qDebug() << "Finding Text"; + bool newText = results.empty(); + bool research = false; + if(!newText) + research = !results.keys()[0]->text().contains(text); + //Clear results if the user gives a new search string + if(research) + results.clear(); + + if(research or newText) { + for(int i = 0; i < numPages; i++) { + QList<Poppler::TextBox*> textList = DOC->page(i)->textList(); + for(int j = 0; j < textList.size(); j++) { + if(textList[j]->text().contains(text, (matchCase) + ? Qt::CaseSensitive : Qt::CaseInsensitive)) { + results.insert(textList[j], i); + } + } + } + currentHighlight = (forward) ? -1 : results.size(); + } + + qDebug() << "Jumping to next result"; + if(!results.empty()) { + //Jump to the location of the next or previous textbox and highlight + if(forward) { + currentHighlight = (currentHighlight + 1) % results.size(); + }else{ + currentHighlight--; + //Ensure currentHighlight will be between 0 and results.size() - 1 + if(currentHighlight < 0) + currentHighlight = results.size() - 1; + } + + qDebug() << "Jump to location: " << currentHighlight; + + Poppler::TextBox *currentText = results.keys()[currentHighlight]; + WIDGET->setCurrentPage(results.value(currentText)); + WIDGET->highlightText(currentHighlight, currentText->boundingBox()); + + QTimer::singleShot(10, WIDGET, SLOT(updatePreview())); + }else{ + //Print "No results found" + } + } +} + +void MainUI::enableFind() { + if(ui->findGroup->isVisible()) { + qDebug() << "Disabling Find"; + ui->findGroup->setVisible(false); + WIDGET->setGeometry(QRect(WIDGET->pos(), + QSize(WIDGET->width(), WIDGET->height()+ui->findGroup->height()))); + QTimer::singleShot(0, WIDGET, SLOT(updatePreview())); + this->setFocus(); + }else{ + qDebug() << "Enabling Find"; + ui->findGroup->setGeometry(QRect(QPoint(0, WIDGET->height()-ui->findGroup->height()), + QSize(WIDGET->width()-12, ui->findGroup->height()))); + ui->findGroup->setVisible(true); + WIDGET->setGeometry(QRect(WIDGET->pos(), + QSize(WIDGET->width(), WIDGET->height()-ui->findGroup->height()))); + + QTimer::singleShot(0, WIDGET, SLOT(updatePreview())); + ui->findGroup->setFocus(); + } +} + +void MainUI::showBookmarks() { + ui->bookmarksFrame->setVisible(true); +} + +void MainUI::resizeEvent(QResizeEvent *event) { + if(ui->findGroup->isVisible()) { + ui->findGroup->setGeometry(QRect(QPoint(0, WIDGET->height()-ui->findGroup->height()), + QSize(WIDGET->width()-10, ui->findGroup->height()))); + } + QMainWindow::resizeEvent(event); +} diff --git a/src-qt5/desktop-utils/lumina-pdf/mainUI.h b/src-qt5/desktop-utils/lumina-pdf/mainUI.h index 87d2a4e4..2d23b402 100644 --- a/src-qt5/desktop-utils/lumina-pdf/mainUI.h +++ b/src-qt5/desktop-utils/lumina-pdf/mainUI.h @@ -17,8 +17,12 @@ #include <QDebug> #include <QWheelEvent> #include <QApplication> +#include <QMenu> -#include <poppler-qt5.h> +#include <poppler/qt5/poppler-qt5.h> +#include "PresentationLabel.h" +#include "propDialog.h" +#include "PrintWidget.h" namespace Ui{ class MainUI; @@ -32,20 +36,22 @@ public: void loadFile(QString path); - private: Poppler::Document *DOC; - QPrintPreviewWidget *WIDGET; + PrintWidget *WIDGET; Ui::MainUI *ui; - QPrinter* Printer; + PropDialog *PROPDIALOG; QPrintDialog *PrintDLG; - QString lastdir; + bool matchCase; + QMap<Poppler::TextBox*, int> results; + int currentHighlight; //Other Interface elements QProgressBar *progress; QAction *progAct; //action associated with the progressbar QTimer *clockTimer; + QMenu *contextMenu; //QFrame *frame_presenter; QLabel *label_clock; QAction *clockAct; @@ -57,7 +63,7 @@ private: void loadPage(int num, Poppler::Document *doc, MainUI *obj, QSize dpi, QSizeF page); //Functions/variables for the presentation mode - QLabel *presentationLabel; + PresentationLabel *presentationLabel; QScreen *getScreen(bool current, bool &cancelled); int CurrentPage; void startPresentation(bool atStart); @@ -65,11 +71,24 @@ private: void endPresentation(); private slots: - void startLoadingPages(QPrinter *printer); + void startLoadingPages(); void slotPageLoaded(int); - void slotStartPresentation(QAction *act); + //void slotStartPresentation(QAction *act); + + //Simplification routines + void nextPage(){ ShowPage( WIDGET->currentPage() ); } //currentPage() starts at 1 rather than 0 + void prevPage(){ ShowPage( WIDGET->currentPage()-2 ); } //currentPage() starts at 1 rather than 0 + void firstPage(){ ShowPage(0); } + void lastPage(){ ShowPage(numPages-1); } + void startPresentationHere(){ startPresentation(false); } + void startPresentationBeginning(){ startPresentation(true); } + void closePresentation(){ endPresentation(); } + + void showInformation(); + void find(QString text, bool forward); + void enableFind(); + void showBookmarks(); - void paintOnWidget(QPrinter *PRINTER); void paintToPrinter(QPrinter *PRINTER); //Button Slots @@ -77,49 +96,18 @@ private slots: //Other interface slots void updateClock(); + void showContextMenu(const QPoint&){ contextMenu->popup(QCursor::pos()); } + void updateContextMenu(); + + void setScroll(bool); + void rotate(bool); signals: void PageLoaded(int); protected: - void keyPressEvent(QKeyEvent *event){ - //See if this is one of the special hotkeys and act appropriately - //qDebug() << "Got Key Press:"; - bool inPresentation = (presentationLabel!=0); - if(!inPresentation){ - //Alternate functionality when **not** in presentation mode - /*if(event->key()==Qt::Key_Down){ - qDebug() << "Send Wheel Event"; - QWheelEvent event( WIDGET->mapFromGlobal(QCursor::pos()), QCursor::pos(),QPoint(0,0), QPoint(0,30), 0, Qt::Vertical, Qt::LeftButton, Qt::NoModifier); - QApplication::sendEvent(WIDGET, &event); - //WIDGET->scrollDown(); - return; - }else if(event->key()==Qt::Key_Up){ - return; - }*/ - } - - if( event->key()==Qt::Key_Escape || event->key()==Qt::Key_Backspace){ - //qDebug() << " - Escape/Backspace"; - endPresentation(); - }else if(event->key()==Qt::Key_Right || event->key()==Qt::Key_Down || event->key()==Qt::Key_Space || event->key()==Qt::Key_PageDown){ - //qDebug() << " - Right/Down/Spacebar" << inPresentation; - ShowPage( WIDGET->currentPage() ); //currentPage() starts at 1 rather than 0 - }else if(event->key()==Qt::Key_Left || event->key()==Qt::Key_Up || event->key()==Qt::Key_PageUp){ - //qDebug() << " - Left/Up"; - ShowPage( WIDGET->currentPage()-2 ); //currentPage() starts at 1 rather than 0 - }else if(event->key()==Qt::Key_Home){ - //qDebug() << " - Home"; - ShowPage(0); //go to the first page - }else if(event->key()==Qt::Key_End){ - //qDebug() << " - End"; - ShowPage( numPages-1 ); //go to the last page - }else if(event->key()==Qt::Key_F11){ - //qDebug() << " - F11"; - endPresentation(); - }else{ - QMainWindow::keyPressEvent(event); - } - } + void keyPressEvent(QKeyEvent*); + void wheelEvent(QWheelEvent*); + void resizeEvent(QResizeEvent*); }; #endif diff --git a/src-qt5/desktop-utils/lumina-pdf/mainUI.ui b/src-qt5/desktop-utils/lumina-pdf/mainUI.ui index 7f555d01..8f6fff27 100644 --- a/src-qt5/desktop-utils/lumina-pdf/mainUI.ui +++ b/src-qt5/desktop-utils/lumina-pdf/mainUI.ui @@ -6,21 +6,120 @@ <rect> <x>0</x> <y>0</y> - <width>659</width> - <height>588</height> + <width>697</width> + <height>694</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> - <widget class="QWidget" name="centralwidget"/> + <widget class="QWidget" name="centralwidget"> + <widget class="QFrame" name="findGroup"> + <property name="geometry"> + <rect> + <x>0</x> + <y>560</y> + <width>691</width> + <height>61</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="closeFind"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="textEdit"/> + </item> + <item> + <widget class="QPushButton" name="findPrevB"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="findNextB"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="matchCase"> + <property name="text"> + <string/> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Find...</string> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QFrame" name="bookmarksFrame"> + <property name="geometry"> + <rect> + <x>0</x> + <y>9</y> + <width>81</width> + <height>601</height> + </rect> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Raised</enum> + </property> + <widget class="QLabel" name="label_2"> + <property name="geometry"> + <rect> + <x>10</x> + <y>0</y> + <width>71</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>Bookmarks</string> + </property> + </widget> + </widget> + </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>659</width> - <height>28</height> + <width>697</width> + <height>21</height> </rect> </property> <widget class="QMenu" name="menuFile"> @@ -32,22 +131,53 @@ <addaction name="actionOpen_PDF"/> <addaction name="separator"/> <addaction name="actionClose"/> + <addaction name="separator"/> + <addaction name="actionProperties"/> </widget> <widget class="QMenu" name="menuPresentation"> <property name="title"> <string>&Presentation</string> </property> - <widget class="QMenu" name="menuStart_Presentation"> - <property name="title"> - <string>Start Presentation</string> - </property> - <addaction name="actionAt_Beginning"/> - </widget> - <addaction name="menuStart_Presentation"/> + <addaction name="actionStart_Begin"/> + <addaction name="actionStart_Here"/> <addaction name="actionStop_Presentation"/> </widget> + <widget class="QMenu" name="menuSettings"> + <property name="title"> + <string>Edit</string> + </property> + <addaction name="actionFind"/> + <addaction name="actionFind_Next"/> + <addaction name="actionFind_Previous"/> + <addaction name="actionClearHighlights"/> + <addaction name="separator"/> + <addaction name="actionSettings"/> + <addaction name="separator"/> + <addaction name="actionScroll_Mode"/> + <addaction name="actionSelect_Mode"/> + <addaction name="separator"/> + </widget> + <widget class="QMenu" name="menuView"> + <property name="title"> + <string>View</string> + </property> + <addaction name="actionZoom_In"/> + <addaction name="actionZoom_Out"/> + <addaction name="separator"/> + <addaction name="actionFirst_Page"/> + <addaction name="actionPrevious_Page"/> + <addaction name="actionNext_Page"/> + <addaction name="actionLast_Page"/> + <addaction name="separator"/> + <addaction name="actionBookmarks"/> + <addaction name="separator"/> + <addaction name="actionRotate_Counterclockwise"/> + <addaction name="actionRotate_Clockwise"/> + </widget> <addaction name="menuFile"/> <addaction name="menuPresentation"/> + <addaction name="menuSettings"/> + <addaction name="menuView"/> </widget> <widget class="QStatusBar" name="statusbar"/> <widget class="QToolBar" name="toolBar"> @@ -72,6 +202,9 @@ <addaction name="actionSingle_Page"/> <addaction name="actionDual_Pages"/> <addaction name="actionAll_Pages"/> + <addaction name="separator"/> + <addaction name="actionZoom_In_2"/> + <addaction name="actionZoom_Out_2"/> </widget> <action name="actionOpen_PDF"> <property name="text"> @@ -137,9 +270,9 @@ <string>All Pages</string> </property> </action> - <action name="actionAt_Beginning"> + <action name="actionStart_Begin"> <property name="text"> - <string>At Beginning</string> + <string>Start Presentation (at beginning)</string> </property> </action> <action name="actionStop_Presentation"> @@ -147,6 +280,118 @@ <string>Stop Presentation</string> </property> </action> + <action name="actionFind"> + <property name="text"> + <string>Find</string> + </property> + </action> + <action name="actionFind_Next"> + <property name="text"> + <string>Find Next</string> + </property> + </action> + <action name="actionFind_Previous"> + <property name="text"> + <string>Find Previous</string> + </property> + </action> + <action name="actionSettings"> + <property name="text"> + <string>Settings</string> + </property> + </action> + <action name="actionZoom_In"> + <property name="text"> + <string>Zoom In</string> + </property> + </action> + <action name="actionZoom_Out"> + <property name="text"> + <string>Zoom Out</string> + </property> + </action> + <action name="actionFirst_Page"> + <property name="text"> + <string>First Page</string> + </property> + </action> + <action name="actionPrevious_Page"> + <property name="text"> + <string>Previous Page</string> + </property> + </action> + <action name="actionNext_Page"> + <property name="text"> + <string>Next Page</string> + </property> + </action> + <action name="actionLast_Page"> + <property name="text"> + <string>Last Page</string> + </property> + </action> + <action name="actionProperties"> + <property name="text"> + <string>Properties</string> + </property> + </action> + <action name="actionBookmarks"> + <property name="text"> + <string>Bookmarks</string> + </property> + </action> + <action name="actionRotate_Counterclockwise"> + <property name="text"> + <string>Rotate Counterclockwise</string> + </property> + </action> + <action name="actionRotate_Clockwise"> + <property name="text"> + <string>Rotate Clockwise</string> + </property> + </action> + <action name="actionScroll_Mode"> + <property name="checkable"> + <bool>false</bool> + </property> + <property name="checked"> + <bool>false</bool> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Scroll Mode</string> + </property> + </action> + <action name="actionZoom_Out_2"> + <property name="text"> + <string/> + </property> + </action> + <action name="actionZoom_In_2"> + <property name="text"> + <string/> + </property> + </action> + <action name="actionStart_Here"> + <property name="text"> + <string>Start Presentation (current slide)</string> + </property> + </action> + <action name="actionSelect_Mode"> + <property name="checkable"> + <bool>false</bool> + </property> + <property name="text"> + <string>Select Mode</string> + </property> + </action> + <action name="actionClearHighlights"> + <property name="text"> + <string>Clear Highlights</string> + </property> + </action> </widget> <resources/> <connections/> diff --git a/src-qt5/desktop-utils/lumina-pdf/propDialog.cpp b/src-qt5/desktop-utils/lumina-pdf/propDialog.cpp new file mode 100644 index 00000000..0c26af74 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-pdf/propDialog.cpp @@ -0,0 +1,56 @@ +//=========================================== +// Lumina Desktop source code +// Copyright (c) 2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== + +#include "propDialog.h" +#include "ui_propDialog.h" + +#include <LuminaXDG.h> + +PropDialog::PropDialog(Poppler::Document *DOC) : QDialog(), ui(new Ui::PropDialog()){ + this->setWindowTitle(tr("PDF Information")); + this->setWindowIcon( LXDG::findIcon("dialog-information","unknown")); + int verMa, verMi; + QString version; + QSize size = DOC->page(0)->pageSize(); + + //Grab the version + DOC->getPdfVersion(&verMa, &verMi); + version = QString::number(verMa)+"."+QString::number(verMi); + + ui->setupUi(this); + + connect(ui->closeButton, SIGNAL(clicked()), this, SLOT(close())); + + //Setup translations + ui->titleL->setText(tr("Title:")); + ui->subjectL->setText(tr("Subject:")); + ui->authorL->setText(tr("Author:")); + ui->creatorL->setText(tr("Creator:")); + ui->producerL->setText(tr("Producer:")); + ui->keywordsL->setText(tr("Keywords:")); + ui->createdL->setText(tr("Created:")); + ui->modifiedL->setText(tr("Modified:")); + ui->versionL->setText(tr("PDF Version:")); + ui->sizeL->setText(tr("Page Size:")); + ui->numberL->setText(tr("Number of Pages:")); + ui->saveButton->setText(tr("Save")); + ui->closeButton->setText(tr("Close")); + + //Fill the text boxes with information from the document + ui->titleE->setText(DOC->title()); + ui->subjectE->setText(DOC->subject()); + ui->authorE->setText(DOC->author()); + ui->creatorE->setText(DOC->creator()); + ui->producerE->setText(DOC->producer()); + ui->keywordE->setText(DOC->keywords()); + ui->createdEntry->setText(DOC->creationDate().toString(Qt::TextDate)); + ui->modifiedEntry->setText(DOC->modificationDate().toString(Qt::TextDate)); + ui->versionL->setText(ui->versionL->text()+version); + ui->sizeL->setText(ui->sizeL->text()+QString::number(size.height())+ + ", "+QString::number(size.width())); + ui->numberL->setText(ui->numberL->text()+QString::number(DOC->numPages())); +} diff --git a/src-qt5/desktop-utils/lumina-pdf/propDialog.h b/src-qt5/desktop-utils/lumina-pdf/propDialog.h new file mode 100644 index 00000000..be67ebd3 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-pdf/propDialog.h @@ -0,0 +1,25 @@ +//=========================================== +// Lumina Desktop source code +// Copyright (c) 2017, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +#ifndef _LUMINA_PDF_VIEWER_PROP_DIALOG_H +#define _LUMINA_PDF_VIEWER_PROP_DIALOG_H + +#include <QDialog> +#include <poppler/qt5/poppler-qt5.h> + +namespace Ui{ + class PropDialog; +}; + +class PropDialog : public QDialog { + Q_OBJECT + public: + PropDialog(Poppler::Document*); + + private: + Ui::PropDialog *ui; +}; +#endif diff --git a/src-qt5/desktop-utils/lumina-pdf/propDialog.ui b/src-qt5/desktop-utils/lumina-pdf/propDialog.ui new file mode 100644 index 00000000..6806f81a --- /dev/null +++ b/src-qt5/desktop-utils/lumina-pdf/propDialog.ui @@ -0,0 +1,477 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>PropDialog</class> + <widget class="QDialog" name="PropDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>PDF Information</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QLabel" name="titleL"> + <property name="text"> + <string>Title:</string> + </property> + </widget> + </item> + <item row="0" column="1" colspan="2"> + <widget class="QTextEdit" name="titleE"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>256</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>512</width> + <height>16</height> + </size> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="subjectL"> + <property name="text"> + <string>Subject:</string> + </property> + </widget> + </item> + <item row="1" column="1" colspan="2"> + <widget class="QTextEdit" name="subjectE"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>256</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>512</width> + <height>16</height> + </size> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="authorL"> + <property name="text"> + <string>Author:</string> + </property> + </widget> + </item> + <item row="2" column="1" colspan="2"> + <widget class="QTextEdit" name="authorE"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>256</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>512</width> + <height>16</height> + </size> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="creatorL"> + <property name="text"> + <string>Creator:</string> + </property> + </widget> + </item> + <item row="3" column="1" colspan="2"> + <widget class="QTextEdit" name="creatorE"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>256</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>512</width> + <height>16</height> + </size> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="producerL"> + <property name="text"> + <string>Producer:</string> + </property> + </widget> + </item> + <item row="4" column="1" colspan="2"> + <widget class="QTextEdit" name="producerE"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>256</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>512</width> + <height>16</height> + </size> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="keywordsL"> + <property name="text"> + <string>Keywords:</string> + </property> + </widget> + </item> + <item row="5" column="1" colspan="2"> + <widget class="QTextEdit" name="keywordE"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>256</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>512</width> + <height>16</height> + </size> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="autoFillBackground"> + <bool>false</bool> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="readOnly"> + <bool>false</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="6" column="0"> + <widget class="QLabel" name="createdL"> + <property name="text"> + <string>Created: </string> + </property> + </widget> + </item> + <item row="6" column="1" colspan="2"> + <widget class="QTextEdit" name="createdEntry"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>256</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>512</width> + <height>16</height> + </size> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="autoFillBackground"> + <bool>false</bool> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="7" column="0"> + <widget class="QLabel" name="modifiedL"> + <property name="text"> + <string>Modified: </string> + </property> + </widget> + </item> + <item row="7" column="1" colspan="2"> + <widget class="QTextEdit" name="modifiedEntry"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>256</width> + <height>16</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>512</width> + <height>16</height> + </size> + </property> + <property name="acceptDrops"> + <bool>false</bool> + </property> + <property name="autoFillBackground"> + <bool>false</bool> + </property> + <property name="frameShape"> + <enum>QFrame::StyledPanel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="verticalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="horizontalScrollBarPolicy"> + <enum>Qt::ScrollBarAlwaysOff</enum> + </property> + <property name="sizeAdjustPolicy"> + <enum>QAbstractScrollArea::AdjustToContents</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + <property name="acceptRichText"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="8" column="0" colspan="3"> + <widget class="QLabel" name="versionL"> + <property name="text"> + <string>PDF Version:</string> + </property> + </widget> + </item> + <item row="9" column="0" colspan="3"> + <widget class="QLabel" name="sizeL"> + <property name="text"> + <string>Page Size:</string> + </property> + </widget> + </item> + <item row="10" column="0" colspan="3"> + <widget class="QLabel" name="numberL"> + <property name="text"> + <string>Number of Pages:</string> + </property> + </widget> + </item> + <item row="11" column="1"> + <widget class="QPushButton" name="saveButton"> + <property name="text"> + <string>Save</string> + </property> + </widget> + </item> + <item row="11" column="2"> + <widget class="QPushButton" name="closeButton"> + <property name="text"> + <string>Close</string> + </property> + <property name="autoDefault"> + <bool>true</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + <property name="flat"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro b/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro index d0cce451..f5118db7 100644 --- a/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro +++ b/src-qt5/desktop-utils/lumina-screenshot/lumina-screenshot.pro @@ -90,13 +90,13 @@ TRANSLATIONS = i18n/l-screenshot_af.ts \ i18n/l-screenshot_zu.ts dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ -dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ desktop.files=lumina-screenshot.desktop desktop.path=$${L_SHAREDIR}/applications/ manpage.path=$${L_MANDIR}/man1/ -manpage.extra="$${MAN_ZIP} lumina-screenshot.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-screenshot.1.gz" +manpage.extra="$${MAN_ZIP} $$PWD/lumina-screenshot.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-screenshot.1.gz" INSTALLS += target desktop manpage diff --git a/src-qt5/desktop-utils/lumina-textedit/MainUI.cpp b/src-qt5/desktop-utils/lumina-textedit/MainUI.cpp index 9e4ce499..bdb9d29c 100644 --- a/src-qt5/desktop-utils/lumina-textedit/MainUI.cpp +++ b/src-qt5/desktop-utils/lumina-textedit/MainUI.cpp @@ -29,15 +29,26 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ fontbox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); QWidget *spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + QWidget *spacer2 = new QWidget(this); + spacer2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + label_readonly = new QAction(tr("Read-Only File"), this); + label_readonly->setEnabled(false); //not an actual button + label_readonly->setToolTip(""); + QFont fnt = this->font(); + fnt.setItalic(true); + fnt.setBold(true); + label_readonly->setFont(fnt); fontSizes = new QSpinBox(this); fontSizes->setRange(5, 72); - fontSizes->setValue(9); + fontSizes->setValue(this->font().pointSize()); fontSizes->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); //For some reason, the FontComboBox is always 2 pixels taller than the SpinBox - manually fix that here - fontbox->setFixedHeight(30); - fontSizes->setFixedHeight(32); + fontbox->setFixedHeight(ui->toolBar->iconSize().height()-2); + fontSizes->setFixedHeight(ui->toolBar->iconSize().height()); ui->toolBar->addWidget(spacer); + ui->toolBar->addAction(label_readonly); + ui->toolBar->addWidget(spacer2); ui->toolBar->addWidget(fontbox); ui->toolBar->addWidget(fontSizes); //Load the special Drag and Drop QTabWidget @@ -72,6 +83,10 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ for(int i=0; i<smodes.length(); i++){ ui->menuSyntax_Highlighting->addAction(smodes[i]); } + + bool toolbarVisible = settings->value("showToolbar",true).toBool(); + ui->toolBar->setHidden(!toolbarVisible); + ui->actionShow_Toolbar->setChecked(toolbarVisible); ui->actionLine_Numbers->setChecked( settings->value("showLineNumbers",true).toBool() ); ui->actionWrap_Lines->setChecked( settings->value("wrapLines",true).toBool() ); ui->actionShow_Popups->setChecked( settings->value("showPopupWarnings",true).toBool() ); @@ -96,6 +111,7 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ connect(tabWidget->dndTabBar(), SIGNAL(DetachTab(int)), this, SLOT(tabDetached(int)) ); connect(tabWidget->dndTabBar(), SIGNAL(DroppedIn(QStringList)), this, SLOT(LoadArguments(QStringList)) ); connect(tabWidget->dndTabBar(), SIGNAL(DraggedOut(int, Qt::DropAction)), this, SLOT(tabDraggedOut(int, Qt::DropAction)) ); + connect(ui->actionShow_Toolbar, SIGNAL(toggled(bool)), this, SLOT(showToolbar(bool)) ); connect(ui->actionLine_Numbers, SIGNAL(toggled(bool)), this, SLOT(showLineNumbers(bool)) ); connect(ui->actionWrap_Lines, SIGNAL(toggled(bool)), this, SLOT(wrapLines(bool)) ); connect(ui->actionShow_Popups, SIGNAL(toggled(bool)), this, SLOT(showPopupWarnings(bool)) ); @@ -184,6 +200,17 @@ QString MainUI::currentFileDir(){ return dir; } +QStringList MainUI::unsavedFiles(){ + QStringList unsaved; + for(int i=0; i<tabWidget->count(); i++){ + PlainTextEditor *tmp = static_cast<PlainTextEditor*>(tabWidget->widget(i)); + if(tmp->hasChange()){ + unsaved << tmp->currentFile(); + } + } + return unsaved; +} + // ================= // PRIVATE SLOTS //================= @@ -234,16 +261,27 @@ void MainUI::CloseFile(){ if(index>=0){ tabClosed(index); } } -void MainUI::SaveFile(){ +bool MainUI::SaveFile(){ PlainTextEditor *cur = currentEditor(); - if(cur==0){ return; } - cur->SaveFile(); + if(cur==0){ return true; } //nothing to do + return cur->SaveFile(); } -void MainUI::SaveFileAs(){ +bool MainUI::SaveFileAs(){ PlainTextEditor *cur = currentEditor(); - if(cur==0){ return; } - cur->SaveFile(true); + if(cur==0){ return true; } //nothing to do + return cur->SaveFile(true); +} + +bool MainUI::SaveAllFiles(){ + bool ok = true; + for(int i=0; i<tabWidget->count() && ok; i++){ + PlainTextEditor *tmp = static_cast<PlainTextEditor*>(tabWidget->widget(i)); + if(tmp->hasChange()){ + ok = ok && tmp->SaveFile(); + } + } + return ok; } void MainUI::Print() { @@ -337,6 +375,11 @@ void MainUI::showPopupWarnings(bool show){ settings->setValue("showPopupWarnings",show); } +void MainUI::showToolbar(bool show){ + settings->setValue("showToolbar",show); + ui->toolBar->setHidden(!show); +} + void MainUI::updateTab(QString file){ PlainTextEditor *cur = 0; int index = -1; @@ -356,6 +399,7 @@ void MainUI::updateTab(QString file){ tabWidget->setTabWhatsThis(index, file); //needed for drag/drop functionality ui->actionSave_File->setEnabled(changes); this->setWindowTitle( (changes ? "*" : "") + file.section("/",-2) ); + label_readonly->setVisible( cur->readOnlyFile() ); } void MainUI::tabChanged(){ @@ -373,6 +417,7 @@ void MainUI::tabChanged(){ fontbox->setCurrentFont(font); fontSizes->setValue( font.pointSize() ); ui->actionWrap_Lines->setChecked( cur->lineWrapMode()==QPlainTextEdit::WidgetWidth ); + label_readonly->setVisible( cur->readOnlyFile() ); } void MainUI::tabClosed(int tab){ @@ -489,21 +534,31 @@ PlainTextEditor *cur = currentEditor(); //============= void MainUI::closeEvent(QCloseEvent *ev){ //See if any of the open editors have unsaved changes first - QStringList unsaved; - for(int i=0; i<tabWidget->count(); i++){ - PlainTextEditor *tmp = static_cast<PlainTextEditor*>(tabWidget->widget(i)); - if(tmp->hasChange()){ - unsaved << tmp->currentFile(); - } + QStringList unsaved = unsavedFiles(); + if(unsaved.isEmpty() || !ui->actionShow_Popups->isChecked()){ + QMainWindow::closeEvent(ev); + return; + } + + //Otherwise, ask the user what to do. + QMessageBox::StandardButton but = QMessageBox::question( + this, + tr("Save Changes before closing?"), + QString(tr("There are unsaved changes.\nDo you want save them before you close the editor?\n\n%1")).arg(unsaved.join("\n")), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, + QMessageBox::No); + + if(but == QMessageBox::Cancel){ + ev->ignore(); + return; } - if(unsaved.isEmpty()){ QMainWindow::closeEvent(ev); return; } - bool savenow = false; - if(!savenow && !ui->actionShow_Popups->isChecked()){ savenow = true; } - if(!savenow){ - QMessageBox::StandardButton but = QMessageBox::question(this, tr("Save Changes before closing?"), QString(tr("There are unsaved changes.\nDo you want save them before you close the editor?\n\n%1")).arg(unsaved.join("\n")), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::No); - savenow = (but == QMessageBox::Yes); - if(but == QMessageBox::Cancel){ ev->ignore(); return; } + else if(but == QMessageBox::Yes){ + if( !SaveAllFiles() ){ + //cancelled by user + ev->ignore(); + return; } - if(savenow){ SaveFile(); } - QMainWindow::closeEvent(ev); + + } + QMainWindow::closeEvent(ev); } diff --git a/src-qt5/desktop-utils/lumina-textedit/MainUI.h b/src-qt5/desktop-utils/lumina-textedit/MainUI.h index 6e5d2d23..464e7a52 100644 --- a/src-qt5/desktop-utils/lumina-textedit/MainUI.h +++ b/src-qt5/desktop-utils/lumina-textedit/MainUI.h @@ -13,6 +13,8 @@ #include <QShortcut> #include <QFontComboBox> #include <QSpinBox> +#include <QAction> +#include <QApplication> #include "PlainTextEditor.h" #include "ColorDialog.h" @@ -40,18 +42,21 @@ private: QSettings *settings; QShortcut *closeFindS; QSpinBox *fontSizes; + QAction *label_readonly; //Simplification functions PlainTextEditor* currentEditor(); QString currentFileDir(); + QStringList unsavedFiles(); private slots: //Main Actions void NewFile(); void OpenFile(QString file = ""); void CloseFile(); //current file only - void SaveFile(); - void SaveFileAs(); + bool SaveFile(); + bool SaveFileAs(); + bool SaveAllFiles(); void Print(); void fontChanged(const QFont &font); void updateStatusTip(); @@ -60,6 +65,7 @@ private slots: //Other Menu Actions void UpdateHighlighting(QAction *act = 0); + void showToolbar(bool); void showLineNumbers(bool); void wrapLines(bool); void ModifyColors(); diff --git a/src-qt5/desktop-utils/lumina-textedit/MainUI.ui b/src-qt5/desktop-utils/lumina-textedit/MainUI.ui index 026521b3..f88f3976 100644 --- a/src-qt5/desktop-utils/lumina-textedit/MainUI.ui +++ b/src-qt5/desktop-utils/lumina-textedit/MainUI.ui @@ -182,7 +182,7 @@ <x>0</x> <y>0</y> <width>505</width> - <height>28</height> + <height>24</height> </rect> </property> <property name="contextMenuPolicy"> @@ -224,6 +224,7 @@ </widget> <addaction name="menuSyntax_Highlighting"/> <addaction name="menuTabs_Location"/> + <addaction name="actionShow_Toolbar"/> <addaction name="actionLine_Numbers"/> <addaction name="actionWrap_Lines"/> <addaction name="actionShow_Popups"/> @@ -436,6 +437,17 @@ <string>Ctrl+P</string> </property> </action> + <action name="actionShow_Toolbar"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Toolbar</string> + </property> + </action> </widget> <tabstops> <tabstop>line_find</tabstop> diff --git a/src-qt5/desktop-utils/lumina-textedit/PlainTextEditor.cpp b/src-qt5/desktop-utils/lumina-textedit/PlainTextEditor.cpp index 653bd0e8..b1592cc3 100644 --- a/src-qt5/desktop-utils/lumina-textedit/PlainTextEditor.cpp +++ b/src-qt5/desktop-utils/lumina-textedit/PlainTextEditor.cpp @@ -24,7 +24,7 @@ PlainTextEditor::PlainTextEditor(QSettings *set, QWidget *parent) : QPlainTextEd LNW = new LNWidget(this); showLNW = true; watcher = new QFileSystemWatcher(this); - hasChanges = false; + hasChanges = readonly = false; lastSaveContents.clear(); matchleft = matchright = -1; this->setTabStopWidth( 8 * this->fontMetrics().width(" ") ); //8 character spaces per tab (UNIX standard) @@ -76,17 +76,22 @@ void PlainTextEditor::LoadFile(QString filepath){ bool diffFile = (filepath != this->whatsThis()); this->setWhatsThis(filepath); this->clear(); - QList<SyntaxFile> files = SyntaxFile::availableFiles(settings); + /*QList<SyntaxFile> files = SyntaxFile::availableFiles(settings); for(int i=0; i<files.length(); i++){ if(files[i].supportsFile(filepath) ){ files[i].SetupDocument(this); SYNTAX->loadRules(files[i]); break; } - } + }*/ //SYNTAX->loadRules( Custom_Syntax::ruleForFile(filepath.section("/",-1), settings) ); lastSaveContents = LUtils::readFile(filepath).join("\n"); if(diffFile){ + SYNTAX->loadRules( Custom_Syntax::ruleForFile(this->whatsThis().section("/",-1), settings) ); + if(SYNTAX->loadedRules().isEmpty()){ + SYNTAX->loadRules( Custom_Syntax::ruleForFirstLine( lastSaveContents.section("\n",0,0,QString::SectionSkipEmpty) , settings) ); + } + SYNTAX->setupDocument(this); this->setPlainText( lastSaveContents ); }else{ //Try to keep the mouse cursor/scroll in the same position @@ -99,18 +104,34 @@ void PlainTextEditor::LoadFile(QString filepath){ this->centerCursor(); //scroll until cursor is centered (if possible) } hasChanges = false; - if(QFile::exists(filepath)){ watcher->addPath(filepath); } + readonly = false; + if(QFile::exists(filepath)){ + readonly = !QFileInfo(filepath).isWritable(); + watcher->addPath(filepath); + }else if(filepath.startsWith("/")){ + //See if the containing directory is writable instead + readonly = !QFileInfo(filepath.section("/",0,-2)).isWritable(); + } emit FileLoaded(this->whatsThis()); } -void PlainTextEditor::SaveFile(bool newname){ +bool PlainTextEditor::SaveFile(bool newname){ + //NOTE: This returns true for proper behaviour, and false for a user-cancelled process //qDebug() << "Save File:" << this->whatsThis(); + //Quick check for a non-editable file + if(!newname && this->whatsThis().startsWith("/")){ + if(!QFileInfo(this->whatsThis()).isWritable()){ newname = true; } //cannot save the current file name/location + } if( !this->whatsThis().startsWith("/") || newname ){ //prompt for a filename/path QString file = QFileDialog::getSaveFileName(this, tr("Save File"), this->whatsThis(), tr("Text File (*)")); - if(file.isEmpty()){ return; } + if(file.isEmpty()){ return false; } //cancelled this->setWhatsThis(file); SYNTAX->loadRules( Custom_Syntax::ruleForFile(this->whatsThis().section("/",-1), settings) ); + if(SYNTAX->loadedRules().isEmpty()){ + SYNTAX->loadRules( Custom_Syntax::ruleForFirstLine( this->toPlainText().section("\n",0,0,QString::SectionSkipEmpty) , settings) ); + } + SYNTAX->setupDocument(this); SYNTAX->rehighlight(); } if( !watcher->files().isEmpty() ){ watcher->removePaths(watcher->files()); } @@ -118,6 +139,8 @@ void PlainTextEditor::SaveFile(bool newname){ hasChanges = !ok; if(ok){ lastSaveContents = this->toPlainText(); emit FileLoaded(this->whatsThis()); } watcher->addPath(currentFile()); + readonly = !QFileInfo(this->whatsThis()).isWritable(); //update this flag + return true; //qDebug() << " - Success:" << ok << hasChanges; } @@ -129,6 +152,11 @@ bool PlainTextEditor::hasChange(){ return hasChanges; } +bool PlainTextEditor::readOnlyFile(){ + //qDebug() << "Read Only File:" << readonly << this->whatsThis(); + return readonly; +} + //Functions for managing the line number widget int PlainTextEditor::LNWWidth(){ //Get the number of chars we need for line numbers diff --git a/src-qt5/desktop-utils/lumina-textedit/PlainTextEditor.h b/src-qt5/desktop-utils/lumina-textedit/PlainTextEditor.h index 0c83b7ce..b0a6cbc7 100644 --- a/src-qt5/desktop-utils/lumina-textedit/PlainTextEditor.h +++ b/src-qt5/desktop-utils/lumina-textedit/PlainTextEditor.h @@ -21,7 +21,7 @@ class PlainTextEditor : public QPlainTextEdit{ public: PlainTextEditor(QSettings *set, QWidget *parent = 0); ~PlainTextEditor(); - + //Functions for setting up the editor void showLineNumbers(bool show = true); void LoadSyntaxRule(QString type); @@ -29,18 +29,19 @@ public: //File loading/setting options void LoadFile(QString filepath); - void SaveFile(bool newname = false); + bool SaveFile(bool newname = false); QString currentFile(); bool hasChange(); + bool readOnlyFile(); //Functions for managing the line number widget (internal - do not need to run directly) int LNWWidth(); //replacing the LNW size hint detection void paintLNW(QPaintEvent *ev); //forwarded from the LNW paint event - void updateLNW(); + void updateLNW(); QFontMetrics *metrics; - + private: QWidget *LNW; //Line Number Widget bool showLNW; @@ -55,8 +56,9 @@ private: void clearMatchData(); void highlightMatch(QChar ch, bool forward, int fromPos, QChar startch); - //Flags to keep track of changes - bool hasChanges; + //Flags to keep track of changes/status + bool hasChanges, readonly; + private slots: //Functions for managing the line number widget void LNW_updateWidth(); // Tied to the QPlainTextEdit::blockCountChanged() signal @@ -68,7 +70,7 @@ private slots: void textChanged(); void cursorMoved(); //Function for prompting the user if the file changed externally - void fileChanged(); + void fileChanged(); protected: void resizeEvent(QResizeEvent *ev); diff --git a/src-qt5/desktop-utils/lumina-textedit/lumina-textedit.pro b/src-qt5/desktop-utils/lumina-textedit/lumina-textedit.pro index a9c16a0c..77cd8798 100644 --- a/src-qt5/desktop-utils/lumina-textedit/lumina-textedit.pro +++ b/src-qt5/desktop-utils/lumina-textedit/lumina-textedit.pro @@ -91,7 +91,7 @@ TRANSLATIONS = i18n/l-te_af.ts \ i18n/l-te_zu.ts dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/ -dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ +dotrans.extra=cd $$PWD/i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/ desktop.files=lumina-textedit.desktop desktop.path=$${L_SHAREDIR}/applications/ @@ -103,7 +103,7 @@ syntax.path=$${L_SHAREDIR}/lumina-desktop/syntax_rules syntax.files=syntax_rules/* manpage.path=$${L_MANDIR}/man1/ -manpage.extra="$${MAN_ZIP} lumina-textedit.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-textedit.1.gz" +manpage.extra="$${MAN_ZIP} $$PWD/lumina-textedit.1 > $(INSTALL_ROOT)$${L_MANDIR}/man1/lumina-textedit.1.gz" INSTALLS += target desktop link syntax manpage diff --git a/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp b/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp index 53f51f4e..a80d4149 100644 --- a/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp +++ b/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp @@ -83,6 +83,16 @@ bool SyntaxFile::supportsFile(QString file){ return false; } +bool SyntaxFile::supportsFirstLine(QString line){ + line = line.simplified(); + if(metaObj.contains("first_line_match")){ + return metaObj.value("first_line_match").toArray().contains(line); + }else if(metaObj.contains("first_line_regex")){ + return (QRegExp( metaObj.value("first_line_regex").toString() ).indexIn(line) >=0 ); + } + return false; +} + bool SyntaxFile::LoadFile(QString file, QSettings *settings){ QStringList contents = LUtils::readFile(file); //Now trim the extra non-JSON off the beginning of the file @@ -209,6 +219,13 @@ QString Custom_Syntax::ruleForFile(QString filename, QSettings *settings){ return ""; } +QString Custom_Syntax::ruleForFirstLine(QString line, QSettings *settings){ + QList<SyntaxFile> files = SyntaxFile::availableFiles(settings); + for(int i=0; i<files.length(); i++){ + if(files[i].supportsFirstLine(line)){ return files[i].name(); } + } + return ""; +} void Custom_Syntax::loadRules(QString type){ QList<SyntaxFile> files = SyntaxFile::availableFiles(settings); diff --git a/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h b/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h index bffbfd1a..9949a90c 100644 --- a/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h +++ b/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h @@ -46,6 +46,7 @@ public: void SetupDocument(QPlainTextEdit *editor); bool supportsFile(QString file); //does this syntax set support the file? + bool supportsFirstLine(QString line); //is the type of file defined by the first line of the file? ("#!/bin/<something>" for instance) //Main Loading routine (run this before other functions) bool LoadFile(QString file, QSettings *settings); @@ -66,10 +67,13 @@ public: } ~Custom_Syntax(){} + QString loadedRules(){ return syntax.name(); } + static QStringList availableRules(QSettings *settings); static QStringList knownColors(); static void SetupDefaultColors(QSettings *settings); static QString ruleForFile(QString filename, QSettings *settings); + static QString ruleForFirstLine(QString line, QSettings *settings); void loadRules(QString type); void loadRules(SyntaxFile sfile); @@ -77,6 +81,8 @@ public: loadRules( syntax.name() ); } + void setupDocument(QPlainTextEdit *edit){ syntax.SetupDocument(edit); } //simple redirect for the function in the currently-loaded rules + protected: void highlightBlock(const QString &text){ //qDebug() << "Highlight Block:" << text; @@ -159,7 +165,7 @@ protected: int last = text.length()-1; while(last>=0 && (text[last]==' ' || text[last]=='\t' ) ){ last--; } if(last < text.length()-1){ - setFormat(last+1, text.length()-1-last, fmt); + setFormat(last+1, text.length()-1-last, fmt); } } } diff --git a/src-qt5/desktop-utils/lumina-textedit/syntax_rules/README.md b/src-qt5/desktop-utils/lumina-textedit/syntax_rules/README.md index fa00b557..04190672 100644 --- a/src-qt5/desktop-utils/lumina-textedit/syntax_rules/README.md +++ b/src-qt5/desktop-utils/lumina-textedit/syntax_rules/README.md @@ -9,9 +9,11 @@ A small comment section may be placed at the top of the file where every line st # Requirements 1. A "meta" object containing the following variables (meta information about the rules): 1. "name" : The name that will be shown to the user for this set of syntax rules. - 2. If this syntax file is to be automatically applied to particular file type, then one of the following options must be set: + 2. If this syntax file is to be automatically applied to particular file type, then at least one of the following options must be set: 1. "file_suffix" : An array of file extensions which are supported by this syntax rule set (Example: temp.foo will be matched by "file_suffix"=["foo"] ) 2. "file_regex" : A regular expression which should be used to find if the filename matches this rule set. + 3. "first_line_match" : *(only used if no filename rules matched)* Exact match for the first line of text in the file (Example: "#!/bin/sh") + 4. "first_line_regex" : *(only used if no filename rules matched)* Regular expression to use when find a match for the first line of text in the file 2. A "format" object containing the following variables (file-wide formatting): 1. "columns_per_line" : (integer, optional) For file formats with line-length restrictions, this will automatically highlight/flag any "overage" of the designated limit. 2. "highlight_whitespace_eol" : (boolian, optional) Highlight any excess whitespace at the end of a line. diff --git a/src-qt5/desktop-utils/lumina-textedit/syntax_rules/json.syntax b/src-qt5/desktop-utils/lumina-textedit/syntax_rules/json.syntax index ab67d384..1982e599 100644 --- a/src-qt5/desktop-utils/lumina-textedit/syntax_rules/json.syntax +++ b/src-qt5/desktop-utils/lumina-textedit/syntax_rules/json.syntax @@ -8,7 +8,8 @@ { "meta": { "name": "JSON", - "file_suffix": ["json", "syntax"] + "file_suffix": ["json", "syntax"], + "first_line_match":["{"] }, "format": { "line_wrap": false, diff --git a/src-qt5/desktop-utils/lumina-textedit/syntax_rules/python.syntax b/src-qt5/desktop-utils/lumina-textedit/syntax_rules/python.syntax index 6690d98c..2145beec 100644 --- a/src-qt5/desktop-utils/lumina-textedit/syntax_rules/python.syntax +++ b/src-qt5/desktop-utils/lumina-textedit/syntax_rules/python.syntax @@ -8,7 +8,8 @@ { "meta": { "name": "Python", - "file_suffix": ["py", "pyc"] + "file_suffix": ["py", "pyc"], + "first_line_regex" : "(#!).+(python)" }, "format": { "line_wrap": false, diff --git a/src-qt5/desktop-utils/lumina-textedit/syntax_rules/sh.syntax b/src-qt5/desktop-utils/lumina-textedit/syntax_rules/sh.syntax index 5f38cadc..f2256731 100644 --- a/src-qt5/desktop-utils/lumina-textedit/syntax_rules/sh.syntax +++ b/src-qt5/desktop-utils/lumina-textedit/syntax_rules/sh.syntax @@ -8,7 +8,8 @@ { "meta": { "name": "Shell", - "file_suffix": ["sh"] + "file_suffix": ["sh"], + "first_line_match":["#!/bin/sh", "#!/sbin/openrc-run"] }, "format": { "line_wrap": false, |