You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
483 lines
16 KiB
483 lines
16 KiB
/***************************************************************************
|
|
kplayeractionlist.cpp
|
|
---------------------
|
|
begin : Thu Apr 13 2006
|
|
copyright : (C) 2006-2007 by kiriuja
|
|
email : http://kplayer.sourceforge.net/email.html
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* 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 3 of the License, or *
|
|
* (at your option) any later version. *
|
|
***************************************************************************/
|
|
|
|
#include <tdeaction.h>
|
|
#include <tdelocale.h>
|
|
#include <tqpopupmenu.h>
|
|
#include <tqregexp.h>
|
|
|
|
#ifdef DEBUG
|
|
#include <kdebug.h>
|
|
kdbgstream kdDebugTime (void);
|
|
#define DEBUG_KPLAYER_ACTIONLIST
|
|
#endif
|
|
|
|
#include "kplayeractionlist.h"
|
|
#include "kplayeractionlist.moc"
|
|
#include "kplayerproperties.h"
|
|
|
|
KPlayerActionList::KPlayerActionList (const TQString& text, const TQString& status,
|
|
const TQString& whatsthis, TQObject* parent, const char* name)
|
|
: TQObject (parent, name), m_text (text), m_status (status), m_whatsthis (whatsthis)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Creating action list\n";
|
|
#endif
|
|
m_actions.setAutoDelete (true);
|
|
}
|
|
|
|
KPlayerActionList::~KPlayerActionList()
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Destroying action list\n";
|
|
#endif
|
|
m_actions.clear();
|
|
}
|
|
|
|
void KPlayerActionList::plug (void)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "KPlayerActionList::plug\n";
|
|
kdDebugTime() << " Name " << name() << "\n";
|
|
#endif
|
|
emit updated (this);
|
|
if ( ! isEmpty() )
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Inserting separators\n";
|
|
#endif
|
|
TDEAction* action = actions().getFirst();
|
|
int i, count = action -> containerCount();
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Containers " << count << "\n";
|
|
#endif
|
|
for ( i = 0; i < count; i ++ )
|
|
{
|
|
TQWidget* container = action -> container (i);
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Container " << container -> className() << " " << container -> name ("<unnamed>") << "\n";
|
|
#endif
|
|
if ( container -> inherits ("TQPopupMenu") )
|
|
{
|
|
TQPopupMenu* menu = (TQPopupMenu*) container;
|
|
int index = menu -> indexOf (action -> itemId (i));
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Index " << index << "\n";
|
|
#endif
|
|
if ( index > 0 )
|
|
{
|
|
TQMenuItem* item = menu -> findItem (menu -> idAt (index - 1));
|
|
if ( ! item || ! item -> isSeparator() )
|
|
menu -> insertSeparator (index);
|
|
}
|
|
}
|
|
}
|
|
action = actions().getLast();
|
|
count = action -> containerCount();
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Containers " << count << "\n";
|
|
#endif
|
|
for ( i = 0; i < count; i ++ )
|
|
{
|
|
TQWidget* container = action -> container (i);
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Container " << container -> className() << " " << container -> name ("<unnamed>") << "\n";
|
|
#endif
|
|
if ( container -> inherits ("TQPopupMenu") )
|
|
{
|
|
TQPopupMenu* menu = (TQPopupMenu*) container;
|
|
int index = menu -> indexOf (action -> itemId (i)) + 1;
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Index " << index << "\n";
|
|
#endif
|
|
if ( index > 0 && index < int (menu -> count()) )
|
|
{
|
|
TQMenuItem* item = menu -> findItem (menu -> idAt (index));
|
|
if ( ! item || ! item -> isSeparator() )
|
|
menu -> insertSeparator (index);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void KPlayerActionList::unplug (void)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "KPlayerActionList::unplug\n";
|
|
kdDebugTime() << " Name " << name() << "\n";
|
|
#endif
|
|
if ( ! isEmpty() )
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Removing separators\n";
|
|
#endif
|
|
TDEAction* action = actions().getFirst();
|
|
int i, count = action -> containerCount();
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Containers " << count << "\n";
|
|
#endif
|
|
for ( i = 0; i < count; i ++ )
|
|
{
|
|
TQWidget* container = action -> container (i);
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Container " << container -> className() << " " << container -> name ("<unnamed>") << "\n";
|
|
#endif
|
|
if ( container -> inherits ("TQPopupMenu") )
|
|
{
|
|
TQPopupMenu* menu = (TQPopupMenu*) container;
|
|
int index = menu -> indexOf (action -> itemId (i));
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Index " << index << "\n";
|
|
#endif
|
|
if ( index > 0 )
|
|
{
|
|
TQMenuItem* item = menu -> findItem (menu -> idAt (index - 1));
|
|
if ( ! item || item -> isSeparator() )
|
|
menu -> removeItemAt (index - 1);
|
|
}
|
|
}
|
|
}
|
|
action = actions().getLast();
|
|
count = action -> containerCount();
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Containers " << count << "\n";
|
|
#endif
|
|
for ( i = 0; i < count; i ++ )
|
|
{
|
|
TQWidget* container = action -> container (i);
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Container " << container -> className() << " " << container -> name ("<unnamed>") << "\n";
|
|
#endif
|
|
if ( container -> inherits ("TQPopupMenu") )
|
|
{
|
|
TQPopupMenu* menu = (TQPopupMenu*) container;
|
|
int index = menu -> indexOf (action -> itemId (i)) + 1;
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Index " << index << "\n";
|
|
#endif
|
|
if ( index > 0 && index < int (menu -> count()) )
|
|
{
|
|
TQMenuItem* item = menu -> findItem (menu -> idAt (index));
|
|
if ( ! item || item -> isSeparator() )
|
|
menu -> removeItemAt (index);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
emit updating (this);
|
|
m_actions.clear();
|
|
}
|
|
|
|
void KPlayerActionList::updateAction (TDEAction* action)
|
|
{
|
|
TQString text (action -> text());
|
|
action -> setStatusText (m_status.arg (text));
|
|
action -> setWhatsThis (m_whatsthis.arg (text));
|
|
text = m_text.arg (text);
|
|
text.replace ("&", "&&");
|
|
action -> setText (text);
|
|
}
|
|
|
|
void KPlayerActionList::actionActivated (void)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "KPlayerActionList::actionActivated\n";
|
|
#endif
|
|
if ( sender() && sender() -> inherits ("TDEAction") )
|
|
{
|
|
TDEAction* action = (TDEAction*) sender();
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Name " << action -> text() << "\n";
|
|
#endif
|
|
int index = 0;
|
|
TQPtrListIterator<TDEAction> iterator (actions());
|
|
while ( iterator.current() )
|
|
{
|
|
if ( iterator.current() == action )
|
|
{
|
|
actionActivated (action, index);
|
|
break;
|
|
}
|
|
++ index;
|
|
++ iterator;
|
|
}
|
|
}
|
|
}
|
|
|
|
void KPlayerActionList::actionActivated (TDEAction*, int index)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "KPlayerActionList::actionActivated\n";
|
|
kdDebugTime() << " Index " << index << "\n";
|
|
#endif
|
|
emit activated (index);
|
|
}
|
|
|
|
KPlayerSimpleActionList::KPlayerSimpleActionList (const TQStringList& names, const TQString& text,
|
|
const TQString& status, const TQString& whatsthis, TQObject* parent, const char* name)
|
|
: KPlayerActionList (text, status, whatsthis, parent, name), m_names (names)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Creating simple action list\n";
|
|
#endif
|
|
}
|
|
|
|
KPlayerSimpleActionList::~KPlayerSimpleActionList()
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Destroying simple action list\n";
|
|
#endif
|
|
}
|
|
|
|
void KPlayerSimpleActionList::update (void)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "KPlayerSimpleActionList::update\n";
|
|
#endif
|
|
unplug();
|
|
TQStringList::ConstIterator iterator (m_names.constBegin());
|
|
while ( iterator != m_names.constEnd() )
|
|
{
|
|
TDEAction* action = new TDEAction (*iterator, 0, this, SLOT(actionActivated()), this);
|
|
updateAction (action);
|
|
m_actions.append (action);
|
|
++ iterator;
|
|
}
|
|
plug();
|
|
}
|
|
|
|
void KPlayerSimpleActionList::updateAction (TDEAction* action)
|
|
{
|
|
TQString text (action -> text());
|
|
KPlayerPropertyInfo* info = KPlayerMedia::info (text);
|
|
TQString caption (info -> caption());
|
|
if ( caption.isEmpty() )
|
|
caption = i18n(text.utf8());
|
|
action -> setStatusText (m_status.arg (caption));
|
|
action -> setWhatsThis (m_whatsthis.arg (caption));
|
|
caption = m_text.arg (caption);
|
|
caption.replace ("&", "&&");
|
|
action -> setText (caption);
|
|
}
|
|
|
|
KPlayerToggleActionList::KPlayerToggleActionList (const TQStringList& names, const TQMap<TQString, bool>& states,
|
|
const TQString& ontext, const TQString& offtext, const TQString& onstatus, const TQString& offstatus,
|
|
const TQString& onwhatsthis, const TQString& offwhatsthis, TQObject* parent, const char* name)
|
|
: KPlayerSimpleActionList (names, offtext, offstatus, offwhatsthis, parent, name),
|
|
m_states (states), m_on_text (ontext), m_on_status (onstatus), m_on_whatsthis (onwhatsthis)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Creating toggle action list\n";
|
|
#endif
|
|
}
|
|
|
|
KPlayerToggleActionList::~KPlayerToggleActionList()
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Destroying toggle action list\n";
|
|
#endif
|
|
}
|
|
|
|
void KPlayerToggleActionList::updateAction (TDEAction* action)
|
|
{
|
|
TQString text (action -> text());
|
|
KPlayerPropertyInfo* info = KPlayerMedia::info (text);
|
|
TQString caption (info -> caption());
|
|
if ( caption.isEmpty() )
|
|
caption = i18n(text.utf8());
|
|
bool on = m_states [text];
|
|
action -> setStatusText ((on ? m_on_status : m_status).arg (caption));
|
|
action -> setWhatsThis ((on ? m_on_whatsthis : m_whatsthis).arg (caption));
|
|
caption = (on ? m_on_text : m_text).arg (caption);
|
|
caption.replace ("&", "&&");
|
|
action -> setText (caption);
|
|
}
|
|
|
|
void KPlayerToggleActionList::actionActivated (TDEAction* action, int index)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "KPlayerToggleActionList::actionActivated\n";
|
|
kdDebugTime() << " Index " << index << "\n";
|
|
#endif
|
|
KPlayerSimpleActionList::actionActivated (action, index);
|
|
action -> setText (m_names [index]);
|
|
updateAction (action);
|
|
}
|
|
|
|
TQString languageName (int id, TQString language)
|
|
{
|
|
static const TQString middle ("|ave|bam|ben|bih|bos|ces|che|chu|chv|div|epo|est|ewe|fao|fij|fry|glv|grn|hat|hmo|ido|iku|ile|ina|ind|ipk|jav|kal|kan|kas|khm|lao|lav|lin|lit|lug|mah|mal|mri|mar|mlg|mlt|mon|mri|nav|nob|orm|pli|pol|pus|run|sag|slk|sme|snd|sot|tat|tgl|tsn|tuk|tur|uig|zha|");
|
|
static const TQString right ("|aar|abk|afr|aka|amh|ara|asm|ava|aym|aze|bak|bel|bis|bod|bre|cat|cha|cos|cre|cym|dan|deu|dzo|ell|eng|eus|fas|fin|fra|fre|glg|guj|hau|heb|hin|hrv|hun|hye|iii|isl|ita|kat|kik|kor|kur|lat|lim|lub|mkd|mol|msa|mya|nau|nde|nep|nld|nno|nor|nya|oci|oji|ori|oss|pan|que|ron|rus|san|srp|sin|slv|smo|sna|som|sqi|srp|ssw|sun|swa|tam|tel|tgk|tha|tir|ton|tso|twi|ukr|urd|uzb|ven|vie|vol|wol|xho|yid|yor|zho|zul|");
|
|
static const TQString other ("|alb|sq|arg|an|arm|hy|baq|eu|bul|bg|bur|my|cze|cs|chi|zh|cor|kw|wel|cy|ger|de|dut|nl|gre|el|per|fa|ful|ff|geo|ka|gla|gd|gle|ga|her|hz|scr|hr|ibo|ig|ice|is|jpn|ja|kau|kr|kaz|kk|kin|rw|kir|ky|kom|kv|kon|kg|kua|kj|ltz|lb|mac|mk|mao|mi|may|ms|nbl|nr|ndo|ng|por|pt|roh|rm|rum|ro|scc|sr|slo|sk|spa|es|srd|sc|swe|sv|tah|ty|tib|bo|wln|wa");
|
|
static TQRegExp re_lang_code ("^([^\\[]+)\\[([^\\]]+)\\]");
|
|
if ( language.length() < 2 )
|
|
return i18n("Track %1").arg (id);
|
|
TQString name;
|
|
if ( re_lang_code.search (language) >= 0 )
|
|
{
|
|
name = re_lang_code.cap(2).simplifyWhiteSpace();
|
|
if ( ! name.isEmpty() )
|
|
language = name;
|
|
name = re_lang_code.cap(1).simplifyWhiteSpace();
|
|
}
|
|
if ( language.length() == 3 )
|
|
{
|
|
TQString code ('|' + language + '|');
|
|
if ( middle.find (code, 0, false) >= 0 )
|
|
language.remove (1, 1);
|
|
else if ( right.find (code, 0, false) >= 0 )
|
|
language.remove (2, 1);
|
|
else
|
|
{
|
|
int index = other.find (code, 0, false);
|
|
if ( index >= 0 )
|
|
language = other.mid (index + 5, 2);
|
|
}
|
|
}
|
|
TQString locname (TDEGlobal::locale() -> twoAlphaToLanguageName (language));
|
|
if ( locname.isEmpty() )
|
|
{
|
|
if ( language == "no" )
|
|
language = I18N_NOOP("Norwegian");
|
|
else if ( ! name.isEmpty() )
|
|
language = name;
|
|
return i18n(language.utf8());
|
|
}
|
|
return locname;
|
|
}
|
|
|
|
KPlayerTrackActionList::KPlayerTrackActionList (const TQString& text, const TQString& status,
|
|
const TQString& whatsthis, TQObject* parent, const char* name)
|
|
: KPlayerActionList (text, status, whatsthis, parent, name)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Creating track action list\n";
|
|
#endif
|
|
}
|
|
|
|
KPlayerTrackActionList::~KPlayerTrackActionList()
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Destroying track action list\n";
|
|
#endif
|
|
}
|
|
|
|
void KPlayerTrackActionList::addActions (const TQMap<int, TQString>& ids, int id)
|
|
{
|
|
TQMap<int, TQString>::ConstIterator iterator (ids.constBegin()), end (ids.constEnd());
|
|
while ( iterator != end )
|
|
{
|
|
TQString text (languageName (iterator.key(), iterator.data()));
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Stream " << iterator.key() << " " << iterator.data() << " " << text << "\n";
|
|
#endif
|
|
TDEToggleAction* action = new TDEToggleAction (text, 0, this, SLOT(actionActivated()), this);
|
|
updateAction (action);
|
|
action -> setExclusiveGroup (name());
|
|
if ( id == iterator.key() )
|
|
action -> setChecked (true);
|
|
m_actions.append (action);
|
|
++ iterator;
|
|
}
|
|
}
|
|
|
|
void KPlayerTrackActionList::update (const TQMap<int, TQString>& ids, int id)
|
|
{
|
|
unplug();
|
|
if ( ids.count() > 1 )
|
|
addActions (ids, id);
|
|
plug();
|
|
}
|
|
|
|
void KPlayerTrackActionList::actionActivated (TDEAction* action, int index)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "KPlayerTrackActionList::actionActivated\n";
|
|
kdDebugTime() << " Index " << index << "\n";
|
|
#endif
|
|
KPlayerActionList::actionActivated (action, ((TDEToggleAction*) action) -> isChecked() ? index : -1);
|
|
}
|
|
|
|
KPlayerSubtitleTrackActionList::KPlayerSubtitleTrackActionList (const TQString& text, const TQString& status,
|
|
const TQString& whatsthis, TQObject* parent, const char* name)
|
|
: KPlayerTrackActionList (text, status, whatsthis, parent, name)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Creating subtitle track action list\n";
|
|
#endif
|
|
}
|
|
|
|
KPlayerSubtitleTrackActionList::~KPlayerSubtitleTrackActionList()
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "Destroying subtitle track action list\n";
|
|
#endif
|
|
}
|
|
|
|
void KPlayerSubtitleTrackActionList::update (bool show, const TQMap<int, TQString>& sids, int sid,
|
|
const TQMap<int, TQString>& vsids, int vsid, TQStringList files, const TQString& vobsub, const TQString& current)
|
|
{
|
|
unplug();
|
|
if ( sids.count() > 0 || vsids.count() > 0 || files.count() > 0 )
|
|
{
|
|
TDEToggleAction* action = new TDEToggleAction (i18n("&None"), 0, this, SLOT(actionActivated()), this);
|
|
action -> setStatusText (i18n("Turns off subtitle display"));
|
|
action -> setWhatsThis (i18n("Subtitles None command turns off subtitle display."));
|
|
action -> setExclusiveGroup (name());
|
|
if ( ! show )
|
|
action -> setChecked (true);
|
|
m_actions.append (action);
|
|
addActions (sids, sid);
|
|
addActions (vsids, vsid);
|
|
if ( vsids.isEmpty() )
|
|
files << vobsub;
|
|
TQStringList::ConstIterator iterator (files.constBegin()), end (files.constEnd());
|
|
while ( iterator != end )
|
|
{
|
|
TQString text ((*iterator).section ('/', -1, -1));
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << " Subtitle file '" << text << "' " << *iterator << "\n";
|
|
#endif
|
|
if ( ! text.isEmpty() )
|
|
{
|
|
action = new TDEToggleAction (text, 0, this, SLOT (actionActivated()), this);
|
|
updateAction (action);
|
|
action -> setText (text);
|
|
action -> setExclusiveGroup (name());
|
|
if ( show && sid < 0 && vsid < 0 && *iterator == current )
|
|
action -> setChecked (true);
|
|
m_actions.append (action);
|
|
}
|
|
++ iterator;
|
|
}
|
|
}
|
|
plug();
|
|
}
|
|
|
|
void KPlayerSubtitleTrackActionList::actionActivated (TDEAction* action, int index)
|
|
{
|
|
#ifdef DEBUG_KPLAYER_ACTIONLIST
|
|
kdDebugTime() << "KPlayerSubtitleTrackActionList::actionActivated\n";
|
|
kdDebugTime() << " Index " << index << "\n";
|
|
#endif
|
|
if ( ! ((TDEToggleAction*) action) -> isChecked() )
|
|
{
|
|
index = 0;
|
|
((TDEToggleAction*) actions().getFirst()) -> setChecked (true);
|
|
}
|
|
KPlayerActionList::actionActivated (action, index);
|
|
}
|