diff --git a/ChangeLog b/ChangeLog
index 96311f6d..30721916 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,8 @@
3.3.6
-- a licence agreement dialog can be requested by the server
+- support for a country flag icon on the fader tag
+- a licence agreement dialog can be requested by the server
3.3.5 (2014-07-30)
@@ -11,6 +12,7 @@
- added a Linux jamulus.desktop file
+
3.3.4 (2014-02-25)
- true stereo reverberation effect (previously it was a mono reverberation
@@ -28,6 +30,7 @@
- bug fix: the fader level could not be changed if the fader was on solo
+
3.3.3 (2013-12-30)
- support for storing/recovering the window positions
diff --git a/src/audiomixerboard.cpp b/src/audiomixerboard.cpp
index 31ee044c..445d27a4 100755
--- a/src/audiomixerboard.cpp
+++ b/src/audiomixerboard.cpp
@@ -298,12 +298,9 @@ void CChannelFader::SetCountryFlag ( const QLocale::Country eCountry )
{
if ( eCountry != QLocale::AnyCountry )
{
- // get the resource reference string for this country flag
- const QString strCurResourceRef = ":/png/flags/res/flags/" +
- QLocale ( QLocale::AnyLanguage, eCountry ).bcp47Name() + ".png";
-
// try to load the country flag icon
- QPixmap CountryFlagPixmap ( strCurResourceRef );
+ QPixmap CountryFlagPixmap (
+ CCountyFlagIcons::GetResourceReference ( eCountry ) );
// first check if resource reference was valid
if ( CountryFlagPixmap.isNull() )
@@ -322,6 +319,12 @@ void CChannelFader::SetCountryFlag ( const QLocale::Country eCountry )
plblCountryFlag->setVisible ( true );
}
}
+ else
+ {
+ // disable country flag and tool tip
+ plblCountryFlag->setVisible ( false );
+ plblCountryFlag->setToolTip ( "" );
+ }
}
double CChannelFader::CalcFaderGain ( const int value )
diff --git a/src/clientdlg.cpp b/src/clientdlg.cpp
index fefb7c55..e5893a48 100755
--- a/src/clientdlg.cpp
+++ b/src/clientdlg.cpp
@@ -96,17 +96,17 @@ CClientDlg::CClientDlg ( CClient* pNCliP,
"and disconnecting the " ) + APP_NAME + tr ( " software." ) );
// fader tag
- QString strFaderTag = tr ( "Your Alias/Instrument: Set your name "
+ QString strFaderTag = tr ( "Your Alias/Instrument/Country: Set your name "
"or an alias here so that the other musicians you want to play with "
"know who you are. Additionally you may set an instrument picture of "
- "the instrument you play. "
+ "the instrument you play and a flag of the country you are living. "
"What you set here will appear at your fader on the mixer board when "
"you are connected to a " ) + APP_NAME + tr ( " server. This tag will "
"also show up at each client which is connected to the same server as "
"you. If the fader tag is empty, the IP address is shown instead." );
QString strFaderTagTT = tr ( "Set your name and/or instrument and/or "
- "pseoudonym here so that the other musicians can identify you." ) +
+ "country here so that the other musicians can identify you." ) +
TOOLTIP_COM_END_TEXT;
lblServerTag->setWhatsThis ( strFaderTag );
@@ -117,6 +117,9 @@ CClientDlg::CClientDlg ( CClient* pNCliP,
butInstPicture->setWhatsThis ( strFaderTag );
butInstPicture->setToolTip ( strFaderTagTT );
butInstPicture->setAccessibleName ( tr ( "Instrument picture button" ) );
+ butCountryFlag->setWhatsThis ( strFaderTag );
+ butCountryFlag->setToolTip ( strFaderTagTT );
+ butCountryFlag->setAccessibleName ( tr ( "Country flag button" ) );
// local audio input fader
QString strAudFader = tr ( "Local Audio Input Fader: With the "
@@ -212,11 +215,15 @@ CClientDlg::CClientDlg ( CClient* pNCliP,
MainMixerBoard->vecStoredFaderLevels = pClient->vecStoredFaderLevels;
MainMixerBoard->vecStoredFaderIsSolo = pClient->vecStoredFaderIsSolo;
- // init fader tag line edit and instrument picture
+ // init fader tag line edit, instrument picture and country flag
edtFaderTag->setText ( pClient->ChannelInfo.strName );
+
butInstPicture->setIcon ( QIcon (
CInstPictures::GetResourceReference ( pClient->ChannelInfo.iInstrument ) ) );
+ butCountryFlag->setIcon ( QIcon (
+ CCountyFlagIcons::GetResourceReference ( pClient->ChannelInfo.eCountry ) ) );
+
// init status label
OnTimerStatus();
@@ -333,6 +340,51 @@ CClientDlg::CClientDlg ( CClient* pNCliP,
}
+ // Country flag icons popup menu -------------------------------------------
+ pCountryFlagPopupMenu = new QMenu ( this );
+
+ // add an entry for all known country flags
+ for ( int iCurCntry = static_cast ( QLocale::AnyCountry );
+ iCurCntry < static_cast ( QLocale::LastCountry ); iCurCntry++ )
+ {
+ // the "Default" country gets a special icon
+ QIcon CurFlagIcon;
+ QString sCurCountryName;
+
+ if ( static_cast ( iCurCntry ) == QLocale::AnyCountry )
+ {
+ // default icon and name for no flag selected
+ CurFlagIcon.addFile ( ":/png/flags/res/flags/flagnone.png" );
+ sCurCountryName = "None";
+ }
+ else
+ {
+ // get current country enum
+ QLocale::Country eCountry =
+ static_cast ( iCurCntry );
+
+ // get resource file name
+ CurFlagIcon.addFile ( CCountyFlagIcons::GetResourceReference ( eCountry ) );
+
+ // get the country name
+ sCurCountryName = QLocale::countryToString ( eCountry );
+ }
+
+ // only add the entry if a flag is available
+ if ( !CurFlagIcon.isNull() )
+ {
+ // create a menu action with text and image
+ QAction* pCurAction =
+ new QAction ( CurFlagIcon, sCurCountryName, this );
+
+ // add data to identify the action data when it is triggered
+ pCurAction->setData ( iCurCntry );
+
+ pCountryFlagPopupMenu->addAction ( pCurAction );
+ }
+ }
+
+
// Window positions --------------------------------------------------------
// main window
if ( !pClient->vecWindowPosMain.isEmpty() && !pClient->vecWindowPosMain.isNull() )
@@ -382,6 +434,9 @@ CClientDlg::CClientDlg ( CClient* pNCliP,
QObject::connect ( butInstPicture, SIGNAL ( clicked() ),
this, SLOT ( OnInstPictureBut() ) );
+ QObject::connect ( butCountryFlag, SIGNAL ( clicked() ),
+ this, SLOT ( OnCountryFlagBut() ) );
+
// check boxes
QObject::connect ( chbSettings, SIGNAL ( stateChanged ( int ) ),
this, SLOT ( OnSettingsStateChanged ( int ) ) );
@@ -424,6 +479,9 @@ CClientDlg::CClientDlg ( CClient* pNCliP,
QObject::connect ( pInstrPictPopupMenu, SIGNAL ( triggered ( QAction* ) ),
this, SLOT ( OnInstPicturesMenuTriggered ( QAction* ) ) );
+ QObject::connect ( pCountryFlagPopupMenu, SIGNAL ( triggered ( QAction* ) ),
+ this, SLOT ( OnCountryFlagMenuTriggered ( QAction* ) ) );
+
// other
QObject::connect ( pClient,
SIGNAL ( ConClientListNameMesReceived ( CVector ) ),
@@ -685,6 +743,14 @@ void CClientDlg::OnInstPictureBut()
pInstrPictPopupMenu->exec ( this->mapToGlobal ( butInstPicture->pos() ) );
}
+void CClientDlg::OnCountryFlagBut()
+{
+ // open a menu which shows all available country flags which
+ // always appears at the same position relative to the country
+ // flags button
+ pCountryFlagPopupMenu->exec ( this->mapToGlobal ( butCountryFlag->pos() ) );
+}
+
void CClientDlg::OnInstPicturesMenuTriggered ( QAction* SelAction )
{
// get selected instrument
@@ -701,6 +767,23 @@ void CClientDlg::OnInstPicturesMenuTriggered ( QAction* SelAction )
CInstPictures::GetResourceReference ( iSelInstrument ) ) );
}
+void CClientDlg::OnCountryFlagMenuTriggered ( QAction* SelAction )
+{
+ // get selected country
+ const QLocale::Country eSelCountry =
+ static_cast ( SelAction->data().toInt() );
+
+ // set the new value in the data base
+ pClient->ChannelInfo.eCountry = eSelCountry;
+
+ // update channel info at the server
+ pClient->SetRemoteInfo();
+
+ // update icon on the instrument selection button
+ butCountryFlag->setIcon ( QIcon (
+ CCountyFlagIcons::GetResourceReference ( eSelCountry ) ) );
+}
+
void CClientDlg::OnChatTextReceived ( QString strChatText )
{
ChatDlg.AddChatText ( strChatText );
diff --git a/src/clientdlg.h b/src/clientdlg.h
index 03f5c542..77d7e8cb 100755
--- a/src/clientdlg.h
+++ b/src/clientdlg.h
@@ -105,6 +105,7 @@ protected:
QMenu* pViewMenu;
QMenuBar* pMenu;
QMenu* pInstrPictPopupMenu;
+ QMenu* pCountryFlagPopupMenu;
CClientSettingsDlg ClientSettingsDlg;
CChatDlg ChatDlg;
@@ -116,6 +117,7 @@ public slots:
void OnConnectDisconBut();
void OnInstPictureBut();
+ void OnCountryFlagBut();
void OnTimerSigMet();
void OnTimerBuffersLED();
@@ -140,6 +142,7 @@ public slots:
void OnOpenAnalyzerConsole() { ShowAnalyzerConsole(); }
void OnInstPicturesMenuTriggered ( QAction* SelAction );
+ void OnCountryFlagMenuTriggered ( QAction* SelAction );
void OnSettingsStateChanged ( int value );
void OnChatStateChanged ( int value );
diff --git a/src/res/flags/flagnone.png b/src/res/flags/flagnone.png
new file mode 100644
index 00000000..af4134d2
Binary files /dev/null and b/src/res/flags/flagnone.png differ
diff --git a/src/settings.cpp b/src/settings.cpp
index 52f37c0e..0038a044 100755
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -107,6 +107,18 @@ void CSettings::Load()
pClient->ChannelInfo.iInstrument = iValue;
}
+ // country
+ if ( GetNumericIniSet ( IniXMLDocument, "client", "country",
+ 0, static_cast ( QLocale::LastCountry ), iValue ) )
+ {
+ pClient->ChannelInfo.eCountry = static_cast ( iValue );
+ }
+ else
+ {
+ // if no country is given, use the one from the operating system
+ pClient->ChannelInfo.eCountry = QLocale::system().country();
+ }
+
// audio fader
if ( GetNumericIniSet ( IniXMLDocument, "client", "audfad",
AUD_FADER_IN_MIN, AUD_FADER_IN_MAX, iValue ) )
@@ -371,6 +383,10 @@ void CSettings::Save()
SetNumericIniSet ( IniXMLDocument, "client", "instrument",
pClient->ChannelInfo.iInstrument );
+ // country
+ SetNumericIniSet ( IniXMLDocument, "client", "country",
+ static_cast ( pClient->ChannelInfo.eCountry ) );
+
// audio fader
SetNumericIniSet ( IniXMLDocument, "client", "audfad",
pClient->GetAudioInFader() );
diff --git a/src/util.cpp b/src/util.cpp
index 171b8989..459c8950 100755
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -670,6 +670,48 @@ QString CInstPictures::GetName ( const int iInstrument )
}
+// Country flag icon data base -------------------------------------------------
+QString CCountyFlagIcons::GetResourceReference ( const QLocale::Country eCountry )
+{
+ QString strReturn = "";
+
+ // special flag for none
+ if ( eCountry == QLocale::AnyCountry )
+ {
+ strReturn = ":/png/flags/res/flags/flagnone.png";
+ }
+ else
+ {
+ // There is no direct query of the country code in Qt, therefore we use a
+ // workaround: Get the matching locales properties and split the name of
+ // that since the second part is the country code
+ QList vCurLocaleList = QLocale::matchingLocales ( QLocale::AnyLanguage,
+ QLocale::AnyScript,
+ eCountry );
+
+ // check if the matching locales query was successful
+ if ( vCurLocaleList.size() > 0 )
+ {
+ QStringList vstrLocParts = vCurLocaleList.at ( 0 ).name().split("_");
+
+ // the second split contains the name we need
+ if ( vstrLocParts.size() > 1 )
+ {
+ strReturn =
+ ":/png/flags/res/flags/" + vstrLocParts.at ( 1 ).toLower() + ".png";
+
+ // check if file actually exists, if not then invalidate reference
+ if ( !QFile::exists ( strReturn ) )
+ {
+ strReturn = "";
+ }
+ }
+ }
+ }
+
+ return strReturn;
+}
+
/******************************************************************************\
* Global Functions Implementation *
diff --git a/src/util.h b/src/util.h
index be54b8c6..4721df47 100755
--- a/src/util.h
+++ b/src/util.h
@@ -662,6 +662,15 @@ protected:
};
+// Country flag icon data base -------------------------------------------------
+// this is a pure static class
+class CCountyFlagIcons
+{
+public:
+ static QString GetResourceReference ( const QLocale::Country eCountry );
+};
+
+
// Info of a channel -----------------------------------------------------------
class CChannelCoreInfo
{