From 3cba51abf4ee5999fd21ec3d0b2badfb2f508344 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Sun, 22 Jan 2012 22:58:23 +0000 Subject: [PATCH] Reworked SoundManager and SoundPage in the settings. Added new icon in the statusbar to switch off the sound. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4832 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- retroshare-gui/src/RetroShare.pro | 2 + retroshare-gui/src/gui/FriendsDialog.cpp | 16 - retroshare-gui/src/gui/FriendsDialog.h | 3 - retroshare-gui/src/gui/MainWindow.cpp | 22 +- retroshare-gui/src/gui/SoundManager.cpp | 234 +++++++------ retroshare-gui/src/gui/SoundManager.h | 123 +++---- retroshare-gui/src/gui/chat/ChatDialog.cpp | 4 + retroshare-gui/src/gui/chat/ChatWidget.cpp | 22 -- retroshare-gui/src/gui/images.qrc | 3 + retroshare-gui/src/gui/images/mute-off-16.png | Bin 0 -> 913 bytes retroshare-gui/src/gui/images/mute-on-16.png | Bin 0 -> 968 bytes retroshare-gui/src/gui/notifyqt.cpp | 3 + retroshare-gui/src/gui/settings/SoundPage.cpp | 236 +++++++------- retroshare-gui/src/gui/settings/SoundPage.h | 38 ++- retroshare-gui/src/gui/settings/SoundPage.ui | 308 ++++++++---------- .../src/gui/settings/rsharesettings.cpp | 2 + .../src/gui/settings/rsharesettings.h | 3 +- .../src/gui/statusbar/SoundStatus.cpp | 59 ++++ .../src/gui/statusbar/SoundStatus.h | 43 +++ .../src/gui/toaster/OnlineToaster.cpp | 20 -- .../src/gui/toaster/OnlineToaster.h | 2 - retroshare-gui/src/lang/retroshare_de.qm | Bin 339167 -> 339465 bytes retroshare-gui/src/lang/retroshare_de.ts | 216 +++++++----- retroshare-gui/src/main.cpp | 32 +- 24 files changed, 749 insertions(+), 642 deletions(-) create mode 100644 retroshare-gui/src/gui/images/mute-off-16.png create mode 100644 retroshare-gui/src/gui/images/mute-on-16.png create mode 100644 retroshare-gui/src/gui/statusbar/SoundStatus.cpp create mode 100644 retroshare-gui/src/gui/statusbar/SoundStatus.h diff --git a/retroshare-gui/src/RetroShare.pro b/retroshare-gui/src/RetroShare.pro index 6fd1186b5..e7f604274 100644 --- a/retroshare-gui/src/RetroShare.pro +++ b/retroshare-gui/src/RetroShare.pro @@ -349,6 +349,7 @@ HEADERS += rshare.h \ gui/statusbar/ratesstatus.h \ gui/statusbar/hashingstatus.h \ gui/statusbar/discstatus.h \ + gui/statusbar/SoundStatus.h \ gui/advsearch/advancedsearchdialog.h \ gui/advsearch/expressionwidget.h \ gui/advsearch/guiexprelement.h \ @@ -609,6 +610,7 @@ SOURCES += main.cpp \ gui/statusbar/ratesstatus.cpp \ gui/statusbar/hashingstatus.cpp \ gui/statusbar/discstatus.cpp \ + gui/statusbar/SoundStatus.cpp \ gui/toaster/MessageToaster.cpp \ gui/toaster/DownloadToaster.cpp \ gui/toaster/OnlineToaster.cpp \ diff --git a/retroshare-gui/src/gui/FriendsDialog.cpp b/retroshare-gui/src/gui/FriendsDialog.cpp index 2ae6eb8eb..0c1e4b40d 100644 --- a/retroshare-gui/src/gui/FriendsDialog.cpp +++ b/retroshare-gui/src/gui/FriendsDialog.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include "retroshare/rsinit.h" #include "retroshare/rsnotify.h" @@ -792,21 +791,6 @@ void FriendsDialog::setCurrentFileName(const QString &fileName) setWindowModified(false); } -////play sound when recv a message -void FriendsDialog::playsound(){ - Settings->beginGroup("Sound"); - Settings->beginGroup("SoundFilePath"); - QString OnlineSound = Settings->value("NewChatMessage","").toString(); - Settings->endGroup(); - Settings->beginGroup("Enable"); - bool flag = Settings->value("NewChatMessage",false).toBool(); - Settings->endGroup(); - Settings->endGroup(); - if(!OnlineSound.isEmpty()&&flag) - if(QSound::isAvailable()) - QSound::play(OnlineSound); -} - void FriendsDialog::on_actionMessageHistory_triggered() { ImHistoryBrowser imBrowser("", ui.lineEdit, this); diff --git a/retroshare-gui/src/gui/FriendsDialog.h b/retroshare-gui/src/gui/FriendsDialog.h index b5298e15f..59eb30e0b 100644 --- a/retroshare-gui/src/gui/FriendsDialog.h +++ b/retroshare-gui/src/gui/FriendsDialog.h @@ -124,9 +124,6 @@ private: void colorChanged(const QColor &c); void fontChanged(const QFont &font); - ///play the sound when recv a message - void playsound(); - QString fileName; ChatStyle style; diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 583550e3e..f808c4efe 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -56,6 +56,7 @@ #include "help/browser/helpbrowser.h" #include "chat/ChatDialog.h" #include "RetroShareLink.h" +#include "SoundManager.h" #ifdef UNFINISHED #include "unfinished/ApplicationWindow.h" @@ -75,6 +76,7 @@ #include "statusbar/dhtstatus.h" #include "statusbar/hashingstatus.h" #include "statusbar/discstatus.h" +#include "statusbar/SoundStatus.h" #include #include @@ -199,13 +201,10 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags flags) /* WORK OUT IF WE"RE IN ADVANCED MODE OR NOT */ bool advancedMode = false; std::string advsetting; - if (rsConfig->getConfigurationOption(RS_CONFIG_ADVANCED, advsetting) && (advsetting == "YES")) - { - advancedMode = true; + if (rsConfig->getConfigurationOption(RS_CONFIG_ADVANCED, advsetting) && (advsetting == "YES")) { + advancedMode = true; } - - /* add url handler for RetroShare links */ QDesktopServices::setUrlHandler(RSLINK_SCHEME, this, "linkActivated"); @@ -231,7 +230,6 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags flags) connect(ui.actionAbout, SIGNAL(triggered()), this, SLOT( showabout()) ); //connect(ui.actionColor, SIGNAL(triggered()), this, SLOT( setStyle()) ); - /** adjusted quit behaviour: trigger a warning that can be switched off in the saved config file RetroShare.conf */ connect(ui.actionQuit, SIGNAL(triggered()), this, SLOT(doQuit())); @@ -239,31 +237,24 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags flags) /* load the StyleSheet*/ loadStyleSheet(Rshare::stylesheet()); - /* Create the Main pages and actions */ QActionGroup *grp = new QActionGroup(this); - ui.stackPages->add(networkDialog = new NetworkDialog(ui.stackPages), createPageAction(QIcon(IMAGE_NETWORK2), tr("Network"), grp)); - ui.stackPages->add(friendsDialog = new FriendsDialog(ui.stackPages), createPageAction(QIcon(IMAGE_PEERS), tr("Friends"), grp)); - ui.stackPages->add(searchDialog = new SearchDialog(ui.stackPages), createPageAction(QIcon(IMAGE_SEARCH), tr("Search"), grp)); - ui.stackPages->add(transfersDialog = new TransfersDialog(ui.stackPages), transferAction = createPageAction(QIcon(IMAGE_TRANSFERS), tr("Transfers"), grp)); - ui.stackPages->add(sharedfilesDialog = new SharedFilesDialog(ui.stackPages), createPageAction(QIcon(IMAGE_FILES), tr("Files"), grp)); - ui.stackPages->add(messagesDialog = new MessagesDialog(ui.stackPages), messageAction = createPageAction(QIcon(IMAGE_MESSAGES), tr("Messages"), grp)); @@ -316,7 +307,6 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags flags) } #endif - /* Create the toolbar */ ui.toolBar->addActions(grp->actions()); @@ -363,6 +353,8 @@ MainWindow::MainWindow(QWidget* parent, Qt::WFlags flags) ratesstatus = new RatesStatus(); statusBar()->addPermanentWidget(ratesstatus); + + statusBar()->addPermanentWidget(new SoundStatus()); /** Status Bar end ******/ /* Creates a tray icon with a context menu and adds it to the system's * notification area. */ @@ -577,7 +569,7 @@ void MainWindow::createNotifyIcons() updateMessages(); updateForums(); updateChannels(NOTIFY_TYPE_ADD); - privateChatChanged(NOTIFY_LIST_PRIVATE_INCOMING_CHAT, NOTIFY_TYPE_ADD); + privateChatChanged(NOTIFY_LIST_PRIVATE_INCOMING_CHAT, 0); // transfer #undef DELETE_OBJECT diff --git a/retroshare-gui/src/gui/SoundManager.cpp b/retroshare-gui/src/gui/SoundManager.cpp index ee78cbe01..f753b27a6 100644 --- a/retroshare-gui/src/gui/SoundManager.cpp +++ b/retroshare-gui/src/gui/SoundManager.cpp @@ -1,103 +1,131 @@ -/**************************************************************** - * RetroShare is distributed under the following license: - * - * Copyright (C) 2006 - 2009 RetroShare Team - * - * 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - ****************************************************************/ - -#include - -#include "SoundManager.h" -#include "settings/rsharesettings.h" - -SoundManager::SoundManager() -{ - isMute=false; - reInit(); -} - -void SoundManager::doMute(bool t) -{ - isMute=t; -} - -void SoundManager::event_User_go_Online() -{ - if(isMute==true) return; - - if(enable_eventUser_go_Online) - QSound::play(SoundFileUser_go_Online); -} -void SoundManager::event_User_go_Offline() -{ - if(isMute==true) return; - if(enable_eventUser_go_Offline) - QSound::play(SoundFileUser_go_Offline); -} -void SoundManager::event_FileSend_Finished() -{ - if(isMute==true) return; - if(enable_eventFileSend_Finished) - QSound::play(SoundFileFileSend_Finished); -} -void SoundManager::event_FileRecive_Incoming() -{ - if(isMute==true) return; - if(enable_eventFileRecive_Incoming) - QSound::play(SoundFileFileRecive_Incoming); -} - -void SoundManager::event_FileRecive_Finished() -{ - if(isMute==true) return; - if(enable_eventFileRecive_Finished) - QSound::play(SoundFileFileRecive_Finished); -} - - -void SoundManager::event_NewChatMessage() -{ - if(isMute==true) return; - if(enable_eventNewChatMessage) - { - QSound::play(SoundFileNewChatMessage); - - } -} - -void SoundManager::reInit() -{ - Settings->beginGroup("Sound"); - Settings->beginGroup("Enable"); - enable_eventUser_go_Online = Settings->value("User_go_Online",false).toBool(); - enable_eventUser_go_Offline = Settings->value("User_go_Offline",false).toBool(); - enable_eventFileSend_Finished = Settings->value("FileSend_Finished",false).toBool(); - enable_eventFileRecive_Incoming = Settings->value("FileRecive_Incoming",false).toBool(); - enable_eventFileRecive_Finished = Settings->value("FileRecive_Finished",false).toBool(); - enable_eventNewChatMessage = Settings->value("NewChatMessage",false).toBool(); - Settings->endGroup(); - - Settings->beginGroup("SoundFilePath"); - SoundFileUser_go_Online = Settings->value("User_go_Online","").toString(); - SoundFileUser_go_Offline = Settings->value("User_go_Offline","").toString(); - SoundFileFileSend_Finished = Settings->value("FileSend_Finished","").toString(); - SoundFileFileRecive_Incoming = Settings->value("FileRecive_Incoming","").toString(); - SoundFileFileRecive_Finished = Settings->value("FileRecive_Finished","").toString(); - SoundFileNewChatMessage = Settings->value("NewChatMessage","").toString(); - Settings->endGroup(); - Settings->endGroup(); -} +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2012 RetroShare Team + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#include + +#include "SoundManager.h" +#include "settings/rsharesettings.h" + +#define GROUP_MAIN "Sound" +#define GROUP_ENABLE "Enable" +#define GROUP_SOUNDFILE "SoundFilePath" + +SoundManager *soundManager = NULL; + +static QString settingName(SoundManager::Events event) +{ + switch (event) { + case SoundManager::NEW_CHAT_MESSAGE: + return "NewChatMessage"; + case SoundManager::USER_ONLINE: + return "User_go_Online"; + } + + return ""; +} + +void SoundManager::create() +{ + if (soundManager == NULL) { + soundManager = new SoundManager; + } +} + +SoundManager::SoundManager() : QObject() +{ +} + +void SoundManager::setMute(bool mute) +{ + Settings->beginGroup(GROUP_MAIN); + Settings->setValue("mute", mute); + Settings->endGroup(); + + emit SoundManager::mute(mute); +} + +bool SoundManager::isMute() +{ + Settings->beginGroup(GROUP_MAIN); + bool mute = Settings->value("mute", false).toBool(); + Settings->endGroup(); + + return mute; +} + +bool SoundManager::eventEnabled(Events event) +{ + Settings->beginGroup(GROUP_MAIN); + Settings->beginGroup(GROUP_ENABLE); + bool enabled = Settings->value(settingName(event), false).toBool(); + Settings->endGroup(); + Settings->endGroup(); + + return enabled; +} + +void SoundManager::setEventEnabled(Events event, bool enabled) +{ + Settings->beginGroup(GROUP_MAIN); + Settings->beginGroup(GROUP_ENABLE); + Settings->setValue(settingName(event), enabled); + Settings->endGroup(); + Settings->endGroup(); +} + +QString SoundManager::eventFilename(Events event) +{ + Settings->beginGroup(GROUP_MAIN); + Settings->beginGroup(GROUP_SOUNDFILE); + QString filename = Settings->value(settingName(event)).toString(); + Settings->endGroup(); + Settings->endGroup(); + + return filename; +} + +void SoundManager::setEventFilename(Events event, const QString &filename) +{ + Settings->beginGroup(GROUP_MAIN); + Settings->beginGroup(GROUP_SOUNDFILE); + Settings->setValue(settingName(event), filename); + Settings->endGroup(); + Settings->endGroup(); +} + +void SoundManager::play(Events event) +{ + if (isMute() || !QSound::isAvailable() || !eventEnabled(event)) { + return; + } + + QString filename = eventFilename(event); + playFile(filename); +} + + +void SoundManager::playFile(const QString &filename) +{ + if (filename.isEmpty()) { + return; + } + QSound::play(filename); +} diff --git a/retroshare-gui/src/gui/SoundManager.h b/retroshare-gui/src/gui/SoundManager.h index a95c31553..b2eba3dec 100644 --- a/retroshare-gui/src/gui/SoundManager.h +++ b/retroshare-gui/src/gui/SoundManager.h @@ -1,60 +1,63 @@ -/**************************************************************** - * RetroShare is distributed under the following license: - * - * Copyright (C) 2006, 2007 crypton - * - * 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - ****************************************************************/ -#ifndef SOUND_MANAGER_H -#define SOUND_MANAGER_H - -#include - -class SoundManager :public QObject -{ - Q_OBJECT - public: - SoundManager(); - - public slots: - void doMute(bool t); - void event_User_go_Online(); - void event_User_go_Offline(); - void event_FileSend_Finished(); - void event_FileRecive_Incoming(); - void event_FileRecive_Finished(); - void event_NewChatMessage(); - void reInit(); - - - private: - bool isMute; - QString SoundFileUser_go_Online; - QString SoundFileUser_go_Offline; - QString SoundFileFileSend_Finished; - QString SoundFileFileRecive_Incoming; - QString SoundFileFileRecive_Finished; - QString SoundFileNewChatMessage; - - bool enable_eventUser_go_Online; - bool enable_eventUser_go_Offline; - bool enable_eventFileSend_Finished; - bool enable_eventFileRecive_Incoming; - bool enable_eventFileRecive_Finished; - bool enable_eventNewChatMessage; - -}; -#endif +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2012 RetroShare Team + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#ifndef SOUNDMANAGER_H +#define SOUNDMANAGER_H + +#include + +class SoundManager : public QObject +{ + Q_OBJECT + +public: + enum Events { + NEW_CHAT_MESSAGE, + USER_ONLINE + }; + +public slots: + void setMute(bool mute); + +signals: + void mute(bool isMute); + +public: + static void create(); + + bool isMute(); + + void play(Events event); + void playFile(const QString &filename); + + bool eventEnabled(Events event); + void setEventEnabled(Events event, bool enabled); + + QString eventFilename(Events event); + void setEventFilename(Events event, const QString &filename); + +private: + SoundManager(); +}; + +extern SoundManager *soundManager; + +#endif //SOUNDMANAGER_H diff --git a/retroshare-gui/src/gui/chat/ChatDialog.cpp b/retroshare-gui/src/gui/chat/ChatDialog.cpp index 993e9c1c7..fb9b2d4a9 100644 --- a/retroshare-gui/src/gui/chat/ChatDialog.cpp +++ b/retroshare-gui/src/gui/chat/ChatDialog.cpp @@ -29,6 +29,7 @@ #include "PopupChatWindow.h" #include "gui/settings/rsharesettings.h" #include "gui/msgs/MessageComposer.h" +#include "gui/SoundManager.h" #include #include @@ -144,6 +145,9 @@ void ChatDialog::init(const std::string &peerId, const QString &title) /*static*/ void ChatDialog::chatChanged(int list, int type) { if (list == NOTIFY_LIST_PRIVATE_INCOMING_CHAT && type == NOTIFY_TYPE_ADD) { + // play sound when recv a message + soundManager->play(SoundManager::NEW_CHAT_MESSAGE); + std::list ids; if (rsMsgs->getPrivateChatQueueIds(true, ids)) { uint chatflags = Settings->getChatFlags(); diff --git a/retroshare-gui/src/gui/chat/ChatWidget.cpp b/retroshare-gui/src/gui/chat/ChatWidget.cpp index 8485e0601..b7b23703f 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.cpp +++ b/retroshare-gui/src/gui/chat/ChatWidget.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include "ChatWidget.h" #include "ui_ChatWidget.h" @@ -52,25 +51,6 @@ * #define CHAT_DEBUG 1 *****/ -// play sound when recv a message -void playsound() -{ - Settings->beginGroup("Sound"); - Settings->beginGroup("SoundFilePath"); - QString OnlineSound = Settings->value("NewChatMessage","").toString(); - Settings->endGroup(); - Settings->beginGroup("Enable"); - bool flag = Settings->value("NewChatMessage",false).toBool(); - Settings->endGroup(); - Settings->endGroup(); - - if (!OnlineSound.isEmpty() && flag) { - if (QSound::isAvailable()) { - QSound::play(OnlineSound); - } - } -} - ChatWidget::ChatWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ChatWidget) { @@ -330,8 +310,6 @@ void ChatWidget::addChatMsg(bool incoming, const QString &name, const QDateTime resetStatusBar(); if (incoming && chatType == TYPE_NORMAL) { - playsound(); - emit newMessage(this); if (!isVisible() || (window() && (!window()->isActiveWindow() || window()->isMinimized()))) { diff --git a/retroshare-gui/src/gui/images.qrc b/retroshare-gui/src/gui/images.qrc index e158668ba..babdca3f2 100644 --- a/retroshare-gui/src/gui/images.qrc +++ b/retroshare-gui/src/gui/images.qrc @@ -18,6 +18,7 @@ images/btn_27.png images/btn_27_hover.png images/connect_established.png + images/connect_established_low.png images/connect_creating.png images/connect_no.png images/dht16.png @@ -301,6 +302,8 @@ images/message.png images/messages_new.png images/messenger.png + images/mute-off-16.png + images/mute-on-16.png images/network.png images/network16.png images/network32.png diff --git a/retroshare-gui/src/gui/images/mute-off-16.png b/retroshare-gui/src/gui/images/mute-off-16.png new file mode 100644 index 0000000000000000000000000000000000000000..89cb446582a783b14dd9de59f05e04536d41220b GIT binary patch literal 913 zcmV;C18)3@P)T3UJvw8d5gL|YILS%+4=v01%vYZgo5?$E`NncY>4U-3dmxFTU6ery*e z#_u?_Ld5y8%-E7*7z{&a(*>jsDppYwZJ@M;w&%2m?$5a(MtN_}Iq&rLXVd-6a8M&RsCfi{kG_<7(@&;$lQ+Vi0%%48tHlUx{os zi>FV6n3{^-;06BMpMUJ&7XfF_UsQ4&H?XQ=<;LmhD0;nKOoYY}r_*z^uF+^wZ#HAw z=i3M*Vl)_Z9X`1K>qWq&D_4(HS5^J=EEGbg%LPFYAd}0aMNynbCLh5O4FJ2IUL*(6CC=?24v^uHwm*MA7 zDDz1jM}RoK+OY#0H*FfOt6Tf2NH&{+R;R=A z6{Sc~E(D&(-WDe~mFjY3W#t|TFf`d+zq_JJwyhb`DB_wzjr{=H_Ov!C=_z`^Qg4#lf&FSca8aI7>c=^CC<}Bdpdf zcr-Y8&ExTW*WTXFOMtGfE;*fGC1WlajmD~}sc9*~DXL#26)G}zIT=dM!{_r24G#}H z3kwSaO-)VWVwBx(cR?f)`HWQTGn>uUl9H05g&0E$lb8#K!_hz>;H8kA(d+etcDp_K z(Pi@c{Yt8HWi%Sy!1H_qc~PFr<>pDrE45l3(CKvl(%fr{#Ud6k;d`EWIk| nNBP1Wm5`xF#$+;yAMXDjA}Dqs-&4$?00000NkvXXu0mjfs%W?P literal 0 HcmV?d00001 diff --git a/retroshare-gui/src/gui/images/mute-on-16.png b/retroshare-gui/src/gui/images/mute-on-16.png new file mode 100644 index 0000000000000000000000000000000000000000..57bdfafa19bdc1730e951ae83805bab8951dbc33 GIT binary patch literal 968 zcmV;(12_DMP)?x?a|@Uf$k(*AI&ro=@kT=j3-zp7R_6 zPl#imHY>E+R}L#Hl-tY}OX|y(mg`kdt50ys^s72v0~vs{5dU|(Bawj~eYXeun!DCke7$mYt}%k)uOaihDhWQZaHqDueTTR zfFFTq3!*0{G@1g2UlJTu^{|_ZZa0 zV%WkVOcG2eY3L;$A0u;f4~Fdh>vA=inVtQ|<#cWCAFzYV<$}Q=aL?;SnR5h99ug*% z66Dqwz@U-+y7LR?7 z)T0P$uAD>K{}8MrE!n|Oj$~J5h-*1Or_<#(G&EQx63MpVn+}A-VGs-kCUi$JH#ZHX z?gTh(Cs8mzja6TKkCfu6F8ynJ>dO+z+c}`8r-wziZLLP5X_w383co*)YvGaOpJDuh z5v#YVAf6b5@^~vE>gR@RhR)xqUph`CvzfM)RyLc>`97cTMfw&8)M|CDR4Nrt+#JSu z-7YXQ2}s`9m-Z^3aYWqXPH~^*)s%06*GK3 q^-`%+HaRmhO@>2V7vfp(a_(PGbBd^@&(ehe0000 #include @@ -489,6 +490,8 @@ void NotifyQt::UpdateGUI() } break; case RS_POPUP_CONNECT: + soundManager->play(SoundManager::USER_ONLINE); + if (popupflags & RS_POPUP_CONNECT) { toaster = new Toaster(new OnlineToaster(id, name)); diff --git a/retroshare-gui/src/gui/settings/SoundPage.cpp b/retroshare-gui/src/gui/settings/SoundPage.cpp index 05e03f51a..5ff2fe052 100644 --- a/retroshare-gui/src/gui/settings/SoundPage.cpp +++ b/retroshare-gui/src/gui/settings/SoundPage.cpp @@ -19,30 +19,44 @@ * Boston, MA 02110-1301, USA. ****************************************************************/ - -#include #include "SoundPage.h" #include "rsharesettings.h" +#include "util/misc.h" +#define COLUMN_NAME 0 +#define COLUMN_FILENAME 1 +#define COLUMN_COUNT 2 +#define COLUMN_DATA COLUMN_NAME + +#define ROLE_EVENT Qt::UserRole + +#define TYPE_GROUP 0 +#define TYPE_ITEM 1 /** Constructor */ SoundPage::SoundPage(QWidget * parent, Qt::WFlags flags) : ConfigPage(parent, flags) { - /* Invoke the Qt Designer generated object setup routine */ - ui.setupUi(this); + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); - connect(ui.cmd_openFile, SIGNAL(clicked(bool) ),this,SLOT(on_cmd_openFile())); - //connect(ui.cmd_openFile_2,SIGNAL(clicked(bool) ),this,SLOT(on_cmd_openFile2())); - connect(ui.cmd_openFile_3,SIGNAL(clicked(bool) ),this,SLOT(on_cmd_openFile3())); - connect(ui.cmd_openFile_4,SIGNAL(clicked(bool) ),this,SLOT(on_cmd_openFile4())); - connect(ui.cmd_openFile_5,SIGNAL(clicked(bool) ),this,SLOT(on_cmd_openFile5())); - connect(ui.cmd_openFile_6,SIGNAL(clicked(bool) ),this,SLOT(on_cmd_openFile6())); - - ui.groupBox_13->hide(); - ui.groupBox_14->hide(); + connect(ui.eventTreeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(eventChanged(QTreeWidgetItem*, QTreeWidgetItem*))); + connect(ui.filenameEdit, SIGNAL(textChanged(QString)), this, SLOT(filenameChanged(QString))); + connect(ui.clearButton, SIGNAL(clicked()), this, SLOT(clearButtonClicked())); + connect(ui.browseButton, SIGNAL(clicked()), this, SLOT(browseButtonClicked())); + connect(ui.playButton, SIGNAL(clicked()), this, SLOT(playButtonClicked())); - /* Hide platform specific features */ + ui.clearButton->hide(); + ui.eventTreeWidget->setColumnCount(COLUMN_COUNT); + + QTreeWidgetItem *headerItem = ui.eventTreeWidget->headerItem(); + headerItem->setText(COLUMN_NAME, tr("Event")); + headerItem->setText(COLUMN_FILENAME, tr("Filename")); + + ui.eventTreeWidget->header()->setResizeMode(QHeaderView::Fixed); + ui.eventTreeWidget->setTextElideMode(Qt::ElideMiddle); + + /* Hide platform specific features */ #ifdef Q_WS_WIN #endif @@ -52,128 +66,116 @@ SoundPage::~SoundPage() { } -/** Saves the changes on this page */ -bool -SoundPage::save(QString &/*errmsg*/) +QTreeWidgetItem *SoundPage::addGroup(const QString &name) { - Settings->beginGroup("Sound"); - Settings->beginGroup("Enable"); - Settings->setValue("User_go_Online",ui.checkBoxSound->isChecked()); - //settings.setValue("User_go_Offline",ui.checkBoxSound_2->isChecked()); - Settings->setValue("FileSend_Finished",ui.checkBoxSound_3->isChecked()); - Settings->setValue("FileRecive_Incoming",ui.checkBoxSound_4->isChecked()); - Settings->setValue("FileRecive_Finished",ui.checkBoxSound_5->isChecked()); - Settings->setValue("NewChatMessage",ui.checkBoxSound_6->isChecked()); - Settings->endGroup(); - Settings->beginGroup("SoundFilePath"); - Settings->setValue("User_go_Online",ui.txt_SoundFile->text()); - //settings.setValue("User_go_Offline",ui.txt_SoundFile2->text()); - Settings->setValue("FileSend_Finished",ui.txt_SoundFile3->text()); - Settings->setValue("FileRecive_Incoming",ui.txt_SoundFile4->text()); - Settings->setValue("FileRecive_Finished",ui.txt_SoundFile5->text()); - Settings->setValue("NewChatMessage",ui.txt_SoundFile6->text()); - Settings->endGroup(); - Settings->endGroup(); + QTreeWidgetItem *item = new QTreeWidgetItem(TYPE_GROUP); + item->setText(COLUMN_NAME, name); + ui.eventTreeWidget->insertTopLevelItem(ui.eventTreeWidget->topLevelItemCount(), item); + ui.eventTreeWidget->expandItem(item); + + return item; +} + +QTreeWidgetItem *SoundPage::addItem(QTreeWidgetItem *groupItem, const QString &name, SoundManager::Events event) +{ + QTreeWidgetItem *item = new QTreeWidgetItem(TYPE_ITEM); + item->setData(COLUMN_DATA, ROLE_EVENT, event); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + item->setCheckState(COLUMN_NAME, soundManager->eventEnabled(event) ? Qt::Checked : Qt::Unchecked); + item->setText(COLUMN_NAME, name); + item->setText(COLUMN_FILENAME, soundManager->eventFilename(event)); + groupItem->addChild(item); + + return item; +} + +/** Saves the changes on this page */ +bool SoundPage::save(QString &/*errmsg*/) +{ + QTreeWidgetItemIterator itemIterator(ui.eventTreeWidget); + QTreeWidgetItem *item = NULL; + while ((item = *itemIterator) != NULL) { + itemIterator++; + + if (item->type() == TYPE_ITEM) { + SoundManager::Events event = (SoundManager::Events) item->data(COLUMN_DATA, ROLE_EVENT).toInt(); + soundManager->setEventEnabled(event, item->checkState(COLUMN_NAME) == Qt::Checked); + soundManager->setEventFilename(event, item->text(COLUMN_FILENAME)); + } + } return true; } - - /** Loads the settings for this page */ -void -SoundPage::load() +void SoundPage::load() { - Settings->beginGroup("Sound"); - Settings->beginGroup("SoundFilePath"); - ui.txt_SoundFile->setText(Settings->value("User_go_Online","").toString()); - //ui.txt_SoundFile2->setText(settings.value("User_go_Offline","").toString()); - ui.txt_SoundFile3->setText(Settings->value("FileSend_Finished","").toString()); - ui.txt_SoundFile4->setText(Settings->value("FileRecive_Incoming","").toString()); - ui.txt_SoundFile5->setText(Settings->value("FileRecive_Finished","").toString()); - ui.txt_SoundFile6->setText(Settings->value("NewChatMessage","").toString()); + ui.eventTreeWidget->clear(); - if(!ui.txt_SoundFile->text().isEmpty())ui.checkBoxSound->setEnabled(true); - //if(!ui.txt_SoundFile2->text().isEmpty())ui.checkBoxSound_2->setEnabled(true); - if(!ui.txt_SoundFile3->text().isEmpty())ui.checkBoxSound_3->setEnabled(true); - if(!ui.txt_SoundFile4->text().isEmpty())ui.checkBoxSound_4->setEnabled(true); - if(!ui.txt_SoundFile5->text().isEmpty())ui.checkBoxSound_5->setEnabled(true); - if(!ui.txt_SoundFile6->text().isEmpty())ui.checkBoxSound_6->setEnabled(true); + QTreeWidgetItem *groupItem = addGroup(tr("Friend")); + QTreeWidgetItem *childItem = addItem(groupItem, tr("go Online"), SoundManager::USER_ONLINE); - Settings->endGroup(); + groupItem = addGroup(tr("Chatmessage")); + childItem = addItem(groupItem, tr("New Msg"), SoundManager::NEW_CHAT_MESSAGE); - Settings->beginGroup("Enable"); - ui.checkBoxSound->setChecked(Settings->value("User_go_Online",false).toBool()); - //ui.checkBoxSound_2->setChecked(settings.value("User_go_Offline",false).toBool()); - ui.checkBoxSound_3->setChecked(Settings->value("FileSend_Finished",false).toBool()); - ui.checkBoxSound_4->setChecked(Settings->value("FileRecive_Incoming",false).toBool()); - ui.checkBoxSound_5->setChecked(Settings->value("FileRecive_Finished",false).toBool()); - ui.checkBoxSound_6->setChecked(Settings->value("NewChatMessage",false).toBool()); - Settings->endGroup(); - Settings->endGroup(); + ui.eventTreeWidget->resizeColumnToContents(COLUMN_NAME); + + eventChanged(NULL, NULL); } -void SoundPage::on_cmd_openFile() +void SoundPage::eventChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { - - ui.txt_SoundFile->setText(QFileDialog::getOpenFileName(this,"Open File", ".", "wav (*.wav)")); - if(ui.txt_SoundFile->text().isEmpty()){ - ui.checkBoxSound->setChecked(false); - ui.checkBoxSound->setEnabled(false); + if (!current || current->type() != TYPE_ITEM) { + ui.eventGroup->setEnabled(false); + ui.eventName->clear(); + ui.filenameEdit->clear(); + ui.playButton->setEnabled(false); + return; } - else - ui.checkBoxSound->setEnabled(true); + + ui.eventGroup->setEnabled(true); + ui.filenameEdit->setText(current->text(COLUMN_FILENAME)); + + QString eventName; + if (current->parent()) { + eventName = current->parent()->text(COLUMN_NAME) + ": "; + } + eventName += current->text(COLUMN_NAME); + ui.eventName->setText(eventName); } -/*void SoundPage::on_cmd_openFile2() +void SoundPage::filenameChanged(QString filename) { - ui.txt_SoundFile2->setText(QFileDialog::getOpenFileName(this,"Open File", ".", "wav (*.wav)")); - if(ui.txt_SoundFile2->text().isEmpty()){ - ui.checkBoxSound_2->setChecked(false); - ui.checkBoxSound_2->setEnabled(false); - } - else - ui.checkBoxSound_2->setEnabled(true); + ui.playButton->setEnabled(!filename.isEmpty()); + ui.clearButton->setVisible(!filename.isEmpty()); -}*/ -void SoundPage::on_cmd_openFile3() -{ - ui.txt_SoundFile3->setText(QFileDialog::getOpenFileName(this,"Open File", ".", "wav (*.wav)")); - if(ui.txt_SoundFile3->text().isEmpty()){ - ui.checkBoxSound_3->setChecked(false); - ui.checkBoxSound_3->setEnabled(false); + QTreeWidgetItem *item = ui.eventTreeWidget->currentItem(); + if (item) { + item->setText(COLUMN_FILENAME, filename); } - else - ui.checkBoxSound_3->setEnabled(true); } -void SoundPage::on_cmd_openFile4() -{ - ui.txt_SoundFile4->setText(QFileDialog::getOpenFileName(this,"Open File", ".", "wav (*.wav)")); - if(ui.txt_SoundFile4->text().isEmpty()){ - ui.checkBoxSound_4->setChecked(false); - ui.checkBoxSound_4->setEnabled(false); - } - else - ui.checkBoxSound_4->setEnabled(true); -} -void SoundPage::on_cmd_openFile5() -{ - ui.txt_SoundFile5->setText(QFileDialog::getOpenFileName(this,"Open File", ".", "wav (*.wav)")); - if(ui.txt_SoundFile5->text().isEmpty()){ - ui.checkBoxSound_5->setChecked(false); - ui.checkBoxSound_5->setEnabled(false); - } - else - ui.checkBoxSound_5->setEnabled(true); -} -void SoundPage::on_cmd_openFile6() -{ - ui.txt_SoundFile6->setText(QFileDialog::getOpenFileName(this,"Open File", ".", "wav (*.wav)")); - if(ui.txt_SoundFile6->text().isEmpty()){ - ui.checkBoxSound_6->setChecked(false); - ui.checkBoxSound_6->setEnabled(false); - } - else - ui.checkBoxSound_6->setEnabled(true); +void SoundPage::clearButtonClicked() +{ + ui.filenameEdit->clear(); +} + +void SoundPage::browseButtonClicked() +{ + QString filename; + if (!misc::getOpenFileName(this, RshareSettings::LASTDIR_SOUNDS, tr("Open File"), "wav (*.wav)", filename)) { + return; + } + ui.filenameEdit->setText(filename); +} + +void SoundPage::playButtonClicked() +{ + QTreeWidgetItem *item = ui.eventTreeWidget->currentItem(); + if (!item) { + return; + } + + QString filename = item->text(COLUMN_FILENAME); + soundManager->playFile(filename); } diff --git a/retroshare-gui/src/gui/settings/SoundPage.h b/retroshare-gui/src/gui/settings/SoundPage.h index 68cf813f8..557870139 100644 --- a/retroshare-gui/src/gui/settings/SoundPage.h +++ b/retroshare-gui/src/gui/settings/SoundPage.h @@ -26,34 +26,36 @@ #include "configpage.h" #include "ui_SoundPage.h" +#include "gui/SoundManager.h" class SoundPage : public ConfigPage { - Q_OBJECT + Q_OBJECT public: - /** Default Constructor */ - SoundPage(QWidget * parent = 0, Qt::WFlags flags = 0); - /** Default Destructor */ - ~SoundPage(); + /** Default Constructor */ + SoundPage(QWidget * parent = 0, Qt::WFlags flags = 0); + /** Default Destructor */ + ~SoundPage(); - /** Saves the changes on this page */ - bool save(QString &errmsg); - /** Loads the settings for this page */ - void load(); + /** Saves the changes on this page */ + bool save(QString &errmsg); + /** Loads the settings for this page */ + void load(); private slots: - - void on_cmd_openFile(); - //void on_cmd_openFile2(); - void on_cmd_openFile3(); - void on_cmd_openFile4(); - void on_cmd_openFile5(); - void on_cmd_openFile6(); + void eventChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); + void filenameChanged(QString filename); + void clearButtonClicked(); + void browseButtonClicked(); + void playButtonClicked(); private: - /** Qt Designer generated object */ - Ui::SoundPage ui; + QTreeWidgetItem *addGroup(const QString &name); + QTreeWidgetItem *addItem(QTreeWidgetItem *groupItem, const QString &name, SoundManager::Events event); + + /** Qt Designer generated object */ + Ui::SoundPage ui; }; #endif diff --git a/retroshare-gui/src/gui/settings/SoundPage.ui b/retroshare-gui/src/gui/settings/SoundPage.ui index 12b84c94f..ade92225b 100644 --- a/retroshare-gui/src/gui/settings/SoundPage.ui +++ b/retroshare-gui/src/gui/settings/SoundPage.ui @@ -490,190 +490,148 @@ false - - Qt::NoContextMenu - - - - Sound Events + + + QAbstractItemView::NoEditTriggers - - - - - Friend - - - - - - false - - - go Online - - - - - - - false - - - - - - - Browse - - - - - + + true + + + + 1 + + + + + + + + + + + + + 2 + + + + + + + + + + + + + 16 + 16 + + + + + 16 + 16 + + + + + MS Shell Dlg 2 + + + + Qt::NoFocus + + + Reset + + + QPushButton +{ + border-image: url(:/images/closenormal.png) +} + +QPushButton:hover +{ +border-image: url(:/images/closehover.png) +} + +QPushButton:pressed { +border-image: url(:/images/closepressed.png) +} + + + + + + + + + + + + Event name + + + + + + + Event: + + + + + + + Filename: + + + + - - - - Chatmessage - - - - - - false - - - New Msg - - - - - - - false - - - - - - - Browse - - - - - - - - - - FileSend - - - - - - false - - - - - - - Browse - - - - - - - false - - - Finished - - - - - - - - - - FileRecive - - - - - - false - - - Incoming - - - - - - - false - - - - - - - Browse - - - - - - - false - - - Finished - - - - - - - false - - - - - - - Browse - - - - - - - - - - Qt::Vertical - - - - 20 - 29 - - - + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Browse + + + + + + + + :/images/player_play.png:/images/player_play.png + + + + - + + + diff --git a/retroshare-gui/src/gui/settings/rsharesettings.cpp b/retroshare-gui/src/gui/settings/rsharesettings.cpp index 38473ab76..e52a2285b 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.cpp +++ b/retroshare-gui/src/gui/settings/rsharesettings.cpp @@ -190,6 +190,8 @@ static QString getKeyForLastDir(RshareSettings::enumLastDir type) return "Messages"; case RshareSettings::LASTDIR_BLOGS: return "Messages"; + case RshareSettings::LASTDIR_SOUNDS: + return "SOUNDS"; } return ""; } diff --git a/retroshare-gui/src/gui/settings/rsharesettings.h b/retroshare-gui/src/gui/settings/rsharesettings.h index 82c235e93..523af913d 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.h +++ b/retroshare-gui/src/gui/settings/rsharesettings.h @@ -67,7 +67,8 @@ public: LASTDIR_HISTORY, LASTDIR_IMAGES, LASTDIR_MESSAGES, - LASTDIR_BLOGS + LASTDIR_BLOGS, + LASTDIR_SOUNDS }; enum enumToasterPosition diff --git a/retroshare-gui/src/gui/statusbar/SoundStatus.cpp b/retroshare-gui/src/gui/statusbar/SoundStatus.cpp new file mode 100644 index 000000000..148f51de8 --- /dev/null +++ b/retroshare-gui/src/gui/statusbar/SoundStatus.cpp @@ -0,0 +1,59 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2012 RetroShare Team + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#include +#include + +#include "SoundStatus.h" +#include "gui/SoundManager.h" + +#define IMAGE_MUTE_ON ":/images/mute-on-16.png" +#define IMAGE_MUTE_OFF ":/images/mute-off-16.png" + +SoundStatus::SoundStatus(QWidget *parent) + : QWidget(parent) +{ + QHBoxLayout *hbox = new QHBoxLayout(this); + hbox->setMargin(0); + hbox->setSpacing(0); + + imageButton = new QPushButton(this); + imageButton->setFlat(true); + imageButton->setCheckable(true); + imageButton->setMaximumSize(24, 24); + hbox->addWidget(imageButton); + + setLayout(hbox); + + bool isMute = soundManager->isMute(); + imageButton->setChecked(isMute); + + connect(soundManager, SIGNAL(mute(bool)), this, SLOT(mute(bool))); + connect(imageButton, SIGNAL(toggled(bool)), soundManager, SLOT(setMute(bool))); + + mute(isMute); +} + +void SoundStatus::mute(bool isMute) +{ + imageButton->setIcon(QIcon(isMute ? IMAGE_MUTE_ON : IMAGE_MUTE_OFF)); + imageButton->setToolTip(isMute ? tr("Sound on") : tr("Sound off")); +} diff --git a/retroshare-gui/src/gui/statusbar/SoundStatus.h b/retroshare-gui/src/gui/statusbar/SoundStatus.h new file mode 100644 index 000000000..953232042 --- /dev/null +++ b/retroshare-gui/src/gui/statusbar/SoundStatus.h @@ -0,0 +1,43 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2012 RetroShare Team + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#ifndef SOUNDSTATUS_H +#define SOUNDSTATUS_H + +#include + +class QPushButton; + +class SoundStatus : public QWidget +{ + Q_OBJECT + +public: + SoundStatus(QWidget *parent = 0); + +private slots: + void mute(bool isMute); + +private: + QPushButton *imageButton; +}; + +#endif diff --git a/retroshare-gui/src/gui/toaster/OnlineToaster.cpp b/retroshare-gui/src/gui/toaster/OnlineToaster.cpp index c97cf4755..1f4fe7060 100644 --- a/retroshare-gui/src/gui/toaster/OnlineToaster.cpp +++ b/retroshare-gui/src/gui/toaster/OnlineToaster.cpp @@ -17,8 +17,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include - #include "OnlineToaster.h" #include "gui/settings/rsharesettings.h" #include "gui/chat/ChatDialog.h" @@ -44,8 +42,6 @@ OnlineToaster::OnlineToaster(const std::string &peerId, const QString &name) : Q ui.pixmaplabel->setPixmap(avatar); WidgetBackgroundImage::setBackgroundImage(ui.windowFrame, ":images/toaster/backgroundtoaster.png", WidgetBackgroundImage::AdjustNone); - - play(); } void OnlineToaster::chatButtonSlot() @@ -53,19 +49,3 @@ void OnlineToaster::chatButtonSlot() ChatDialog::chatFriend(peerId); hide(); } - -void OnlineToaster::play() -{ - Settings->beginGroup("Sound"); - Settings->beginGroup("SoundFilePath"); - QString OnlineSound = Settings->value("User_go_Online","").toString(); - Settings->endGroup(); - Settings->beginGroup("Enable"); - bool flag = Settings->value("User_go_Online",false).toBool(); - Settings->endGroup(); - Settings->endGroup(); - - if(!OnlineSound.isEmpty()&&flag) - if(QSound::isAvailable()) - QSound::play(OnlineSound); -} diff --git a/retroshare-gui/src/gui/toaster/OnlineToaster.h b/retroshare-gui/src/gui/toaster/OnlineToaster.h index c2bf9fbba..e21c6b998 100644 --- a/retroshare-gui/src/gui/toaster/OnlineToaster.h +++ b/retroshare-gui/src/gui/toaster/OnlineToaster.h @@ -38,8 +38,6 @@ private slots: void chatButtonSlot(); private: - void play(); - std::string peerId; /** Qt Designer generated object */ diff --git a/retroshare-gui/src/lang/retroshare_de.qm b/retroshare-gui/src/lang/retroshare_de.qm index b132617b09ebbd26fd7deeb79cbf2b3b5ac413e6..7fb20491aa9318c353f1641dd036c92e7d0427b0 100644 GIT binary patch delta 17712 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 delta 17661 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 LM+V1>&C~t|p+>1N diff --git a/retroshare-gui/src/lang/retroshare_de.ts b/retroshare-gui/src/lang/retroshare_de.ts index 22d2c0c46..cf4490e3b 100644 --- a/retroshare-gui/src/lang/retroshare_de.ts +++ b/retroshare-gui/src/lang/retroshare_de.ts @@ -691,7 +691,7 @@ p, li { white-space: pre-wrap; } CertificatePage - + Certificate files Zertifikat-Dateien @@ -1088,7 +1088,7 @@ p, li { white-space: pre-wrap; } ChatDialog - + Friend not Online Freund ist nicht online @@ -1102,7 +1102,7 @@ Do you want to send them a Message instead ChatLobbyDialog - + Lobby management Lobby Verwaltung @@ -1159,7 +1159,7 @@ p, li { white-space: pre-wrap; } Neue Chat Lobby erstellen - + Name Name @@ -1179,7 +1179,7 @@ p, li { white-space: pre-wrap; } Öffentliche Lobbies - + Create chat lobby Erstelle Chat Lobby @@ -1512,7 +1512,7 @@ p, li { white-space: pre-wrap; } Löscht den gespeicherten und angezeigten Chat Verlauf - + Paste RetroShare Link RetroShare Link einfügen @@ -1522,7 +1522,7 @@ p, li { white-space: pre-wrap; } tippt... - + Do you really want to physically delete the history? Möchtest du wirklich den Nachrichtenverlauf physisch löschen? @@ -1537,7 +1537,7 @@ p, li { white-space: pre-wrap; } Lade Bilddatei - + Save as... Speichern unter... @@ -1547,7 +1547,7 @@ p, li { white-space: pre-wrap; } Text Datei (*.txt );;Alle Dateien (*) - + apears to be Offline. ist Offline. @@ -1899,7 +1899,12 @@ und meinen GPG Schlüssel nicht unterzeichnet ConnectFriendWizard - + + Certificate Load Failed + Das Zertifikat konnte nicht geladen werden + + + Connect Friend Wizard Assistent um sich zu einem Freund zu verbinden @@ -4785,6 +4790,11 @@ p, li { white-space: pre-wrap; } Connect To Friend Zum Freund verbinden + + + Copy certificate link + + Copy RetroShare Link @@ -4842,13 +4852,13 @@ p, li { white-space: pre-wrap; } Alle reduzieren - + Available Verfügbar - + Do you want to remove this Friend? Möchtest du diesen Freund entfernen? @@ -4916,7 +4926,7 @@ p, li { white-space: pre-wrap; } Statusnachricht ändern - + Group Chat Gruppenchat @@ -5088,12 +5098,12 @@ p, li { white-space: pre-wrap; } Löscht den gespeicherten und angezeigten Chat Verlauf - + Chat lobbies Chat Lobbies - + Profile Profil @@ -5103,7 +5113,7 @@ p, li { white-space: pre-wrap; } Neuigkeiten - + Welcome to RetroShare's group chat. Willkommen bei RetroShare's Gruppenchat. @@ -5113,7 +5123,7 @@ p, li { white-space: pre-wrap; } ich - + Paste RetroShare Link RetroShare Link einfügen @@ -6617,22 +6627,22 @@ Die folgenden Wege sind möglich: MainWindow - + Network Netzwerk - + Friends Freunde - + Transfers Übertragungen - + Messages Nachrichten @@ -6652,7 +6662,7 @@ Die folgenden Wege sind möglich: - + Notify Meldungen @@ -6782,12 +6792,12 @@ Die folgenden Wege sind möglich: Schnellstart Assistent - + Search Suchen - + Files Dateien @@ -6848,7 +6858,7 @@ Die folgenden Wege sind möglich: Maximieren - + Unfinished unfertig @@ -6858,7 +6868,7 @@ Die folgenden Wege sind möglich: - + Help Hilfe @@ -6868,17 +6878,17 @@ Die folgenden Wege sind möglich: Über - + Forums Foren - + RetroShare %1 a secure decentralised communication platform RetroShare %1 eine sichere und dezentralisierte Kommunikationsplattform - + Open Messages Öffne Nachrichten @@ -6888,12 +6898,12 @@ Die folgenden Wege sind möglich: Anwendungen - + Plugins - + Do you really want to exit RetroShare ? Möchtest du RetroShare wirklich beenden? @@ -7796,7 +7806,7 @@ p, li { white-space: pre-wrap; } MessagesDialog - + New Message Neue Nachricht @@ -7822,14 +7832,14 @@ p, li { white-space: pre-wrap; } - + Date Datum - + From Von @@ -7974,7 +7984,7 @@ p, li { white-space: pre-wrap; } - + Subject Betreff @@ -7989,7 +7999,7 @@ p, li { white-space: pre-wrap; } Gewählte Nachricht weiterleiten - + Starred Gekennzeichnet @@ -8014,7 +8024,7 @@ p, li { white-space: pre-wrap; } Weiterleiten - + Click to sort by attachments Klicken, um nach Anhang zu sortieren @@ -8030,12 +8040,12 @@ p, li { white-space: pre-wrap; } - + Click to sort by from Klicken, um nach Von zu sortieren - + Click to sort by date Klicken, um nach Datum zu sortieren @@ -8045,13 +8055,13 @@ p, li { white-space: pre-wrap; } Klicken, um nach Schlagwörter zu sortieren - + Click to sort by to Klicken, um nach Empfänger zu sortieren - + Reply to All Allen antworten @@ -8077,7 +8087,7 @@ p, li { white-space: pre-wrap; } - + Trash @@ -8126,12 +8136,12 @@ p, li { white-space: pre-wrap; } An - + Click to sort by star Klicken, um nach Kennzeichnung zu sortieren - + No starred messages available. Stars let you give messages a special status to make them easier to find. To star a message, click on the light grey star beside any message. Es sind keine gekennzeichneten Nachrichten vorhanden. Durch die Kennzeichnung kannst du Nachrichten mit einem speziellen Status versehen, sodass sie leichter zu finden sind. Klicke zum Kennzeichnen einer Nachricht auf den hellgrauen Stern neben der jeweiligen Nachricht. @@ -8896,7 +8906,7 @@ p, li { white-space: pre-wrap; } NotifyQt - + GPG key passphrase GPG Schlüssel Passwort @@ -10130,7 +10140,7 @@ p, li { white-space: pre-wrap; } QObject - + RetroShare RetroShare @@ -10249,7 +10259,14 @@ Lockdatei: Der Empfänger der Nachricht ist unbekannt. - + + Click to add this RetroShare cert to your GPG keyring +and open the Make Friend Wizard. + + + + + Add file Datei hinzufügen @@ -10284,7 +10301,7 @@ Lockdatei: Bestätigung - + %1 of %2 RetroShare links processed. %1 von %2 RetroShare Links verarbeitet. @@ -10961,31 +10978,31 @@ p, li { white-space: pre-wrap; } Freunde - - - + + + x - - - + + + kB/s - + Friends of Friends - + General Allgemein - + Total: Gesamt: @@ -12372,61 +12389,106 @@ p, li { white-space: pre-wrap; } SoundPage - Sound Events - Soundereignisse + Soundereignisse - + + Event + Ereignis + + + + Filename + Dateiname + + + go Online Online - + + Open File + Datei öffnen + + FileSend - Dateitransfer + Dateitransfer - - Finished - Beendet + Beendet - FileRecive - Dateitransfer ankommend + Dateitransfer ankommend - Incoming - Eingehend + Eingehend - + Chatmessage Chatnachricht - + Friend Freund - - - - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Search forums</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Suche Foren</span></p></body></html> + + + + Reset + Zurücksetzen + + + + Event: + Ereignis: + + + + Filename: + Dateiname: + + Browse Durchsuchen - + New Msg Neue Nachricht + + SoundStatus + + + Sound on + Ton an + + + + Sound off + Ton aus + + SplashScreen @@ -12435,7 +12497,7 @@ p, li { white-space: pre-wrap; } Lade Profil - + Load configuration Lade Konfiguration diff --git a/retroshare-gui/src/main.cpp b/retroshare-gui/src/main.cpp index 7665ce414..037681853 100644 --- a/retroshare-gui/src/main.cpp +++ b/retroshare-gui/src/main.cpp @@ -44,6 +44,7 @@ #include "gui/common/Emoticons.h" #include "util/EventReceiver.h" #include "gui/RetroShareLink.h" +#include "gui/SoundManager.h" /*** WINDOWS DON'T LIKE THIS - REDEFINES VER numbers. #include @@ -65,9 +66,9 @@ int main(int argc, char *argv[]) } #endif - QStringList args = char_array_to_stringlist(argv+1, argc-1); - - Q_INIT_RESOURCE(images); + QStringList args = char_array_to_stringlist(argv+1, argc-1); + + Q_INIT_RESOURCE(images); rsiface = NULL; @@ -75,7 +76,7 @@ int main(int argc, char *argv[]) createRsIface(*notify); createRsControl(*rsiface, *notify); - /* RetroShare Core Objects */ + /* RetroShare Core Objects */ RsInit::InitRsConfig(); int initResult = RsInit::InitRetroShare(argc, argv); @@ -177,23 +178,23 @@ int main(int argc, char *argv[]) } // true: note auto-login is active - std::string lockFile; - int retVal = RsInit::LockAndLoadCertificates(true, lockFile); + std::string lockFile; + int retVal = RsInit::LockAndLoadCertificates(true, lockFile); switch(retVal) { case 0: break; case 1: QMessageBox::warning( 0, QObject::tr("Multiple instances"), QObject::tr("Another RetroShare using the same profile is " - "already running on your system. Please close " - "that instance first\n Lock file:\n") + - QString::fromStdString(lockFile)); + "already running on your system. Please close " + "that instance first\n Lock file:\n") + + QString::fromStdString(lockFile)); return 1; case 2: QMessageBox::critical( 0, QObject::tr("Multiple instances"), QObject::tr("An unexpected error occurred when Retroshare" - "tried to acquire the single instance lock\n Lock file:\n") + - QString::fromStdString(lockFile)); + "tried to acquire the single instance lock\n Lock file:\n") + + QString::fromStdString(lockFile)); return 1; case 3: QMessageBox::critical( 0, QObject::tr("Login Failure"), @@ -210,10 +211,12 @@ int main(int argc, char *argv[]) return 1; } - /* recreate global settings object, now with correct path */ + /* recreate global settings object, now with correct path */ RshareSettings::Create(true); Rshare::resetLanguageAndStyle(); + SoundManager::create(); + splashScreen.showMessage(rshare.translate("SplashScreen", "Load configuration"), Qt::AlignHCenter | Qt::AlignBottom); rsicontrol->StartupRetroShare(); @@ -323,8 +326,11 @@ int main(int argc, char *argv[]) rsicontrol->rsGlobalShutDown(); + delete(soundManager); + soundManager = NULL; + Settings->sync(); - delete Settings; + delete(Settings); return ti ; }