okular: drop text-to-speech support

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-12-18 16:24:02 +02:00
parent 7fab52b62e
commit 5a08a23f45
7 changed files with 1 additions and 266 deletions

View file

@ -215,7 +215,6 @@ set(okularpart_SRCS
ui/toc.cpp ui/toc.cpp
ui/tocmodel.cpp ui/tocmodel.cpp
ui/toolaction.cpp ui/toolaction.cpp
ui/tts.cpp
ui/videowidget.cpp ui/videowidget.cpp
conf/dlgaccessibilitybase.ui conf/dlgaccessibilitybase.ui
conf/dlgeditorbase.ui conf/dlgeditorbase.ui
@ -232,7 +231,6 @@ kde4_add_plugin(okularpart ${okularpart_SRCS})
target_link_libraries(okularpart target_link_libraries(okularpart
${KDE4_KPARTS_LIBS} ${KDE4_KPARTS_LIBS}
${KDE4_KPASSWDSTORE_LIBS} ${KDE4_KPASSWDSTORE_LIBS}
${KDE4_KSPEECH_LIBS}
${KDE4_KARCHIVE_LIBS} ${KDE4_KARCHIVE_LIBS}
${QT_QTGUI_LIBRARY} ${QT_QTGUI_LIBRARY}
${QT_QTDBUS_LIBRARY} ${QT_QTDBUS_LIBRARY}

View file

@ -95,7 +95,6 @@
<choice name="Path" /> <choice name="Path" />
</choices> </choices>
</entry> </entry>
<entry key="UseKTTSD" type="Bool" />
<entry key="WatchFile" type="Bool" > <entry key="WatchFile" type="Bool" >
<default>true</default> <default>true</default>
</entry> </entry>

View file

@ -62,7 +62,6 @@
#include <kbookmarkmenu.h> #include <kbookmarkmenu.h>
#include <kpassworddialog.h> #include <kpassworddialog.h>
#include <kpasswdstore.h> #include <kpasswdstore.h>
#include <kspeech.h>
// local includes // local includes
#include "aboutdata.h" #include "aboutdata.h"
@ -503,10 +502,6 @@ m_cliPresentation(false), m_cliPrint(false), m_embedMode(detectEmbedMode(parentW
// keep us informed when the user changes settings // keep us informed when the user changes settings
connect( Okular::Settings::self(), SIGNAL(configChanged()), this, SLOT(slotNewConfig()) ); connect( Okular::Settings::self(), SIGNAL(configChanged()), this, SLOT(slotNewConfig()) );
// [SPEECH] check for KTTSD presence and usability
Okular::Settings::setUseKTTSD( KSpeech::isSupported() );
Okular::Settings::self()->writeConfig();
rebuildBookmarkMenu( false ); rebuildBookmarkMenu( false );
if ( m_embedMode == ViewerWidgetMode ) { if ( m_embedMode == ViewerWidgetMode ) {

View file

@ -68,7 +68,6 @@
#include "pageviewannotator.h" #include "pageviewannotator.h"
#include "priorities.h" #include "priorities.h"
#include "toolaction.h" #include "toolaction.h"
#include "tts.h"
#include "videowidget.h" #include "videowidget.h"
#include "core/action.h" #include "core/action.h"
#include "core/area.h" #include "core/area.h"
@ -115,7 +114,6 @@ public:
PageViewPrivate( PageView *qq ); PageViewPrivate( PageView *qq );
FormWidgetsController* formWidgetsController(); FormWidgetsController* formWidgetsController();
OkularTTS* tts();
QString selectedText() const; QString selectedText() const;
// the document, pageviewItems and the 'visible cache' // the document, pageviewItems and the 'visible cache'
@ -171,7 +169,6 @@ public:
PageViewMessage * messageWindow; // in pageviewutils.h PageViewMessage * messageWindow; // in pageviewutils.h
bool m_formsVisible; bool m_formsVisible;
FormWidgetsController *formsWidgetController; FormWidgetsController *formsWidgetController;
OkularTTS * m_tts;
QTimer * refreshTimer; QTimer * refreshTimer;
int refreshPage; int refreshPage;
@ -208,9 +205,6 @@ public:
KToggleAction * aViewContinuous; KToggleAction * aViewContinuous;
QAction * aPrevAction; QAction * aPrevAction;
KAction * aToggleForms; KAction * aToggleForms;
KAction * aSpeakDoc;
KAction * aSpeakPage;
KAction * aSpeakStop;
KActionCollection * actionCollection; KActionCollection * actionCollection;
QActionGroup * mouseModeActionGroup; QActionGroup * mouseModeActionGroup;
@ -239,24 +233,6 @@ FormWidgetsController* PageViewPrivate::formWidgetsController()
return formsWidgetController; return formsWidgetController;
} }
OkularTTS* PageViewPrivate::tts()
{
if ( !m_tts )
{
m_tts = new OkularTTS( q );
if ( aSpeakStop )
{
QObject::connect( m_tts, SIGNAL(hasSpeechs(bool)),
aSpeakStop, SLOT(setEnabled(bool)) );
QObject::connect( m_tts, SIGNAL(errorMessage(QString)),
q, SLOT(errorMessage(QString)) );
}
}
return m_tts;
}
/* PageView. What's in this file? -> quick overview. /* PageView. What's in this file? -> quick overview.
* Code weight (in rows) and meaning: * Code weight (in rows) and meaning:
* 160 - constructor and creating actions plus their connected slots (empty stuff) * 160 - constructor and creating actions plus their connected slots (empty stuff)
@ -299,7 +275,6 @@ PageView::PageView( QWidget *parent, Okular::Document *document )
d->messageWindow = new PageViewMessage(this); d->messageWindow = new PageViewMessage(this);
d->m_formsVisible = false; d->m_formsVisible = false;
d->formsWidgetController = 0; d->formsWidgetController = 0;
d->m_tts = 0;
d->refreshTimer = 0; d->refreshTimer = 0;
d->refreshPage = -1; d->refreshPage = -1;
d->aRotateClockwise = 0; d->aRotateClockwise = 0;
@ -318,9 +293,6 @@ PageView::PageView( QWidget *parent, Okular::Document *document )
d->aViewContinuous = 0; d->aViewContinuous = 0;
d->aPrevAction = 0; d->aPrevAction = 0;
d->aToggleForms = 0; d->aToggleForms = 0;
d->aSpeakDoc = 0;
d->aSpeakPage = 0;
d->aSpeakStop = 0;
d->actionCollection = 0; d->actionCollection = 0;
d->aPageSizes=0; d->aPageSizes=0;
d->setting_viewCols = Okular::Settings::viewColumns(); d->setting_viewCols = Okular::Settings::viewColumns();
@ -397,9 +369,6 @@ PageView::PageView( QWidget *parent, Okular::Document *document )
PageView::~PageView() PageView::~PageView()
{ {
if ( d->m_tts )
d->m_tts->stopAllSpeechs();
// delete the local storage structure // delete the local storage structure
// We need to assign it to a different list otherwise slotAnnotationWindowDestroyed // We need to assign it to a different list otherwise slotAnnotationWindowDestroyed
@ -598,22 +567,6 @@ void PageView::setupActions( KActionCollection * ac )
ta->addAction( d->aMouseTextSelect ); ta->addAction( d->aMouseTextSelect );
ta->addAction( d->aMouseTableSelect ); ta->addAction( d->aMouseTableSelect );
// speak actions
d->aSpeakDoc = new KAction( KIcon( "text-speak" ), i18n( "Speak Whole Document" ), this );
ac->addAction( "speak_document", d->aSpeakDoc );
d->aSpeakDoc->setEnabled( false );
connect( d->aSpeakDoc, SIGNAL(triggered()), SLOT(slotSpeakDocument()) );
d->aSpeakPage = new KAction( KIcon( "text-speak" ), i18n( "Speak Current Page" ), this );
ac->addAction( "speak_current_page", d->aSpeakPage );
d->aSpeakPage->setEnabled( false );
connect( d->aSpeakPage, SIGNAL(triggered()), SLOT(slotSpeakCurrentPage()) );
d->aSpeakStop = new KAction( KIcon( "media-playback-stop" ), i18n( "Stop Speaking" ), this );
ac->addAction( "speak_stop_all", d->aSpeakStop );
d->aSpeakStop->setEnabled( false );
connect( d->aSpeakStop, SIGNAL(triggered()), SLOT(slotStopSpeaks()) );
// Other actions // Other actions
KAction * su = new KAction(i18n("Scroll Up"), this); KAction * su = new KAction(i18n("Scroll Up"), this);
ac->addAction("view_scroll_up", su ); ac->addAction("view_scroll_up", su );
@ -1052,12 +1005,6 @@ void PageView::updateActionState( bool haspages, bool documentChanged, bool hasf
} }
d->aToggleAnnotator->setEnabled( allowAnnotations ); d->aToggleAnnotator->setEnabled( allowAnnotations );
} }
if ( d->aSpeakDoc )
{
const bool enablettsactions = haspages ? Okular::Settings::useKTTSD() : false;
d->aSpeakDoc->setEnabled( enablettsactions );
d->aSpeakPage->setEnabled( enablettsactions );
}
if (d->aMouseMagnifier) { if (d->aMouseMagnifier) {
// FIXME: works only for some zoom-levels // FIXME: works only for some zoom-levels
d->aMouseMagnifier->setVisible(false); d->aMouseMagnifier->setVisible(false);
@ -2505,7 +2452,7 @@ void PageView::mouseReleaseEvent( QMouseEvent * e )
// popup that ask to copy:text and copy/save:image // popup that ask to copy:text and copy/save:image
KMenu menu( this ); KMenu menu( this );
QAction *textToClipboard = 0, *speakText = 0, *imageToClipboard = 0, *imageToFile = 0; QAction *textToClipboard = 0, *imageToClipboard = 0, *imageToFile = 0;
if ( d->document->supportsSearching() && !selectedText.isEmpty() ) if ( d->document->supportsSearching() && !selectedText.isEmpty() )
{ {
menu.addTitle( i18np( "Text (1 character)", "Text (%1 characters)", selectedText.length() ) ); menu.addTitle( i18np( "Text (1 character)", "Text (%1 characters)", selectedText.length() ) );
@ -2516,8 +2463,6 @@ void PageView::mouseReleaseEvent( QMouseEvent * e )
textToClipboard->setEnabled( false ); textToClipboard->setEnabled( false );
textToClipboard->setText( i18n("Copy forbidden by DRM") ); textToClipboard->setText( i18n("Copy forbidden by DRM") );
} }
if ( Okular::Settings::useKTTSD() )
speakText = menu.addAction( KIcon("text-speak"), i18n( "Speak Text" ) );
if ( copyAllowed ) if ( copyAllowed )
{ {
addWebShortcutsMenu( &menu, selectedText ); addWebShortcutsMenu( &menu, selectedText );
@ -2580,11 +2525,6 @@ void PageView::mouseReleaseEvent( QMouseEvent * e )
if ( cb->supportsSelection() ) if ( cb->supportsSelection() )
cb->setText( selectedText, QClipboard::Selection ); cb->setText( selectedText, QClipboard::Selection );
} }
else if ( choice == speakText )
{
// [2] speech selection using KTTSD
d->tts()->say( selectedText );
}
} }
} }
// clear widget selection and invalidate rect // clear widget selection and invalidate rect
@ -2765,10 +2705,7 @@ void PageView::mouseReleaseEvent( QMouseEvent * e )
{ {
KMenu menu( this ); KMenu menu( this );
QAction *textToClipboard = menu.addAction( KIcon( "edit-copy" ), i18n( "Copy Text" ) ); QAction *textToClipboard = menu.addAction( KIcon( "edit-copy" ), i18n( "Copy Text" ) );
QAction *speakText = 0;
QAction *httpLink = 0; QAction *httpLink = 0;
if ( Okular::Settings::useKTTSD() )
speakText = menu.addAction( KIcon( "text-speak" ), i18n( "Speak Text" ) );
if ( !d->document->isAllowed( Okular::AllowCopy ) ) if ( !d->document->isAllowed( Okular::AllowCopy ) )
{ {
textToClipboard->setEnabled( false ); textToClipboard->setEnabled( false );
@ -2790,11 +2727,6 @@ void PageView::mouseReleaseEvent( QMouseEvent * e )
{ {
if ( choice == textToClipboard ) if ( choice == textToClipboard )
copyTextSelection(); copyTextSelection();
else if ( choice == speakText )
{
const QString text = d->selectedText();
d->tts()->say( text );
}
else if ( choice == httpLink ) else if ( choice == httpLink )
new KRun( url, this ); new KRun( url, this );
} }
@ -4798,41 +4730,6 @@ void PageView::slotRefreshPage()
Q_ARG( int, req ) ); Q_ARG( int, req ) );
} }
void PageView::slotSpeakDocument()
{
QString text;
QVector< PageViewItem * >::const_iterator it = d->items.constBegin(), itEnd = d->items.constEnd();
for ( ; it < itEnd; ++it )
{
Okular::RegularAreaRect * area = textSelectionForItem( *it );
text.append( (*it)->page()->text( area ) );
text.append( '\n' );
delete area;
}
d->tts()->say( text );
}
void PageView::slotSpeakCurrentPage()
{
const int currentPage = d->document->viewport().pageNumber;
PageViewItem *item = d->items.at( currentPage );
Okular::RegularAreaRect * area = textSelectionForItem( item );
const QString text = item->page()->text( area );
delete area;
d->tts()->say( text );
}
void PageView::slotStopSpeaks()
{
if ( !d->m_tts )
return;
d->m_tts->stopAllSpeechs();
}
void PageView::slotAction( Okular::Action *action ) void PageView::slotAction( Okular::Action *action )
{ {
d->document->processAction( action ); d->document->processAction( action );

View file

@ -234,9 +234,6 @@ Q_OBJECT
void slotToggleForms(); void slotToggleForms();
void slotFormChanged( int pageNumber ); void slotFormChanged( int pageNumber );
void slotRefreshPage(); void slotRefreshPage();
void slotSpeakDocument();
void slotSpeakCurrentPage();
void slotStopSpeaks();
void slotAction( Okular::Action *action ); void slotAction( Okular::Action *action );
void externalKeyPressEvent( QKeyEvent *e ); void externalKeyPressEvent( QKeyEvent *e );
void slotAnnotationWindowDestroyed( QObject *window ); void slotAnnotationWindowDestroyed( QObject *window );

View file

@ -1,113 +0,0 @@
/***************************************************************************
* Copyright (C) 2008 by Pino Toscano <pino@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "tts.h"
#include <qset.h>
#include <klocale.h>
#include <kspeech.h>
/* Private storage. */
class OkularTTS::Private
{
public:
Private( OkularTTS *qq )
: q( qq ), kspeech( 0 )
{
}
void setupIface();
void teardownIface();
OkularTTS *q;
KSpeech* kspeech;
QSet< int > jobs;
};
void OkularTTS::Private::setupIface()
{
if ( kspeech )
return;
if ( !KSpeech::isSupported() )
{
emit q->errorMessage( i18n( "Text-to-Speech not supported" ) );
return;
}
kspeech = new KSpeech(q);
kspeech->setSpeechID(QString::fromLatin1("okular"));
connect( kspeech, SIGNAL(jobStateChanged(int,int)),
q, SLOT(slotJobStateChanged(int,int)) );
}
void OkularTTS::Private::teardownIface()
{
delete kspeech;
kspeech = 0;
}
OkularTTS::OkularTTS( QObject *parent )
: QObject( parent ), d( new Private( this ) )
{
}
OkularTTS::~OkularTTS()
{
d->teardownIface();
delete d;
}
void OkularTTS::say( const QString &text )
{
if ( text.isEmpty() )
return;
d->setupIface();
if ( d->kspeech )
{
const int jobId = d->kspeech->say( text );
if ( jobId > 0 )
{
d->jobs.insert( jobId );
emit hasSpeechs( true );
}
}
}
void OkularTTS::stopAllSpeechs()
{
if ( !d->kspeech )
return;
d->kspeech->removeAllJobs();
}
void OkularTTS::slotJobStateChanged( int jobNum, int state )
{
if ( !d->kspeech )
return;
switch ( state )
{
case KSpeech::JobCanceled: {
d->jobs.remove( jobNum );
emit hasSpeechs( !d->jobs.isEmpty() );
break;
}
default: {
break;
}
}
}
#include "moc_tts.cpp"

View file

@ -1,38 +0,0 @@
/***************************************************************************
* Copyright (C) 2008 by Pino Toscano <pino@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#ifndef _TTS_H_
#define _TTS_H_
#include <qobject.h>
class OkularTTS : public QObject
{
Q_OBJECT
public:
OkularTTS( QObject *parent = 0 );
~OkularTTS();
void say( const QString &text );
void stopAllSpeechs();
signals:
void hasSpeechs( bool has );
void errorMessage( const QString &message );
private slots:
void slotJobStateChanged( int jobNum, int state );
private:
// private storage
class Private;
Private *d;
};
#endif