diff -Naur psi-0.10-test3-orig/iconsets/system/default/emergencyStatusNo.png psi-0.10-test3/iconsets/system/default/emergencyStatusNo.png --- psi-0.10-test3-orig/iconsets/system/default/emergencyStatusNo.png 1970-01-01 00:00:00.000000000 +0000 +++ psi-0.10-test3/iconsets/system/default/emergencyStatusNo.png 2005-12-01 21:49:41.000000000 +0000 @@ -0,0 +1,9 @@ +PNG + + IHDRsO/bKGD pHYs + +B4tIME  % +H tEXtCommentCreated with The GIMPd%n-IDAT(ύӽN1B +, 6n]ћD@<ލ `n,1 ւ RfKɳX}:R2Mb\@ B#*|SsMݿI֛h 78#V + +o'J׻׸ϭUT\u% X<ԭ{-4+U6n}~T8+BpBv-vRD9<0'_{6r3'$hD949F)P8'_<7jW^haIENDB` \ Brak znaku nowej linii na kocu pliku diff -Naur psi-0.10-test3-orig/iconsets/system/default/emergencyStatusYes.png psi-0.10-test3/iconsets/system/default/emergencyStatusYes.png --- psi-0.10-test3-orig/iconsets/system/default/emergencyStatusYes.png 1970-01-01 00:00:00.000000000 +0000 +++ psi-0.10-test3/iconsets/system/default/emergencyStatusYes.png 2005-12-01 21:49:41.000000000 +0000 @@ -0,0 +1,7 @@ +PNG + + IHDRsO/bKGD pHYs + +B4tIME  %\ StEXtCommentCreated with The GIMPd%n.IDAT(ύ1kTA->BJ@RxVB +͛6&褱I +a}* X^Y}I00sÝ*lH5)mAŏ g $ͤ/Z ~Nz|)x'u|-AL1_K7ܲh{9/0.$M^=_cWEݾ^ u%q9Xd"B\4"ֽ9XtgpZQTU2C|AW;jmO dZ'3of/Qic䅁յpxfe_}AIENDB` \ Brak znaku nowej linii na kocu pliku diff -Naur psi-0.10-test3-orig/iconsets/system/default/icondef.xml psi-0.10-test3/iconsets/system/default/icondef.xml --- psi-0.10-test3-orig/iconsets/system/default/icondef.xml 2005-12-01 21:48:37.000000000 +0000 +++ psi-0.10-test3/iconsets/system/default/icondef.xml 2005-12-01 21:49:41.000000000 +0000 @@ -50,6 +50,11 @@ psi/clearChat chatclear.png + + + psi/emergencyStatusYes + emergencyStatusYes.png + psi/compact @@ -57,6 +62,11 @@ + psi/emergencyStatusNo + emergencyStatusNo.png + + + psi/groupChat groupchat.png diff -Naur psi-0.10-test3-orig/src/chatdlg.cpp psi-0.10-test3/src/chatdlg.cpp --- psi-0.10-test3-orig/src/chatdlg.cpp 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/chatdlg.cpp 2005-12-01 21:49:41.000000000 +0000 @@ -87,6 +87,8 @@ PsiToolBar *toolbar; IconAction *act_send, *act_clear, *act_history, *act_info, *act_pgp, *act_icon, *act_file, *act_compact; + IconAction *act_emergencyStatus; // k + int pending; bool keepOpen, warnSend; @@ -241,6 +243,9 @@ d->act_clear = new IconAction (tr("Clear chat window"), "psi/clearChat", tr("Clear chat window"), 0, this); connect( d->act_clear, SIGNAL( activated() ), SLOT( doClearButton() ) ); + d->act_emergencyStatus = new IconAction( tr( "Emergency Status Away" ), "psi/emergencyStatusNo", tr( "Emergency Status Away" ), 0, this, 0, true ); // k + connect( d->act_emergencyStatus, SIGNAL( activated() ), SLOT( doEmergencyStatus() ) ); // k + connect(pa->psi()->iconSelectPopup(), SIGNAL(textSelected(QString)), d, SLOT(addEmoticon(QString))); d->act_icon = new IconAction( tr( "Select icon" ), "psi/smile", tr( "Select icon" ), 0, this ); d->act_icon->setPopup( pa->psi()->iconSelectPopup() ); @@ -262,6 +267,9 @@ d->act_clear->addTo( d->toolbar ); d->toolbar->setStretchableWidget(new StretchWidget(d->toolbar)); + d->act_emergencyStatus->addTo( d->toolbar ); // k + toggleEmergencyAwayStatus(d->pa->getEmergencyAwayStatusStatus()); // k + d->act_icon->addTo( d->toolbar ); d->act_file->addTo( d->toolbar ); d->act_pgp->addTo( d->toolbar ); @@ -676,6 +684,11 @@ #endif } +// k +void ChatDlg::toggleEmergencyAwayStatus(bool signal) { + d->act_emergencyStatus->setOn(signal); +} + void ChatDlg::setLooks() { @@ -714,6 +727,11 @@ d->act_pgp->setIcon( 0 ); d->act_pgp->setIconSet( i ); + QIconSet iea; + iea.setPixmap(IconsetFactory::icon("psi/emergencyStatusNo"), QIconSet::Automatic, QIconSet::Normal, QIconSet::Off); + iea.setPixmap(IconsetFactory::icon("psi/emergencyStatusYes"), QIconSet::Automatic, QIconSet::Normal, QIconSet::On); + d->act_emergencyStatus->setIcon( 0 ); + d->act_emergencyStatus->setIconSet( iea ); /*QBrush brush; brush.setPixmap( QPixmap( option.chatBgImage ) ); @@ -896,6 +914,12 @@ } } +// k +void ChatDlg::doEmergencyStatus() +{ + d->pa->psi()->setEmergencyStatus(); +} + void ChatDlg::doneSend() { appendMessage(d->m, true); diff -Naur psi-0.10-test3-orig/src/chatdlg.h psi-0.10-test3/src/chatdlg.h --- psi-0.10-test3-orig/src/chatdlg.h 2005-08-21 17:44:40.000000000 +0000 +++ psi-0.10-test3/src/chatdlg.h 2005-12-01 21:49:41.000000000 +0000 @@ -71,6 +71,7 @@ void activated(); void updateAvatar(); void updateAvatar(const Jid&); + void toggleEmergencyAwayStatus(bool state); // k private slots: void doInfo(); @@ -90,6 +91,7 @@ void toggleEncryption(); void buildMenu(); void logSelectionChanged(); + void doEmergencyStatus(); // k public: class Private; diff -Naur psi-0.10-test3-orig/src/common.h psi-0.10-test3/src/common.h --- psi-0.10-test3-orig/src/common.h 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/common.h 2005-12-01 21:49:41.000000000 +0000 @@ -125,6 +125,7 @@ bool use_asAway, use_asXa, use_asOffline, use_asWhileDnd; bool use_asMessage; QString asMessage; + QString eaMessage; QString onevent[10]; bool oneventIsActive[10]; diff -Naur psi-0.10-test3-orig/src/options/opt_presence.cpp psi-0.10-test3/src/options/opt_presence.cpp --- psi-0.10-test3-orig/src/options/opt_presence.cpp 2005-08-21 17:44:28.000000000 +0000 +++ psi-0.10-test3/src/options/opt_presence.cpp 2005-12-01 21:49:41.000000000 +0000 @@ -64,6 +64,10 @@ tr("Specifies an extended message to use if you allow Psi" " to set your status automatically. See options above.")); + QWhatsThis::add(d->te_asMessage, + tr("Specifies an extended message to use if you set" + " Emergency Away Status.")); // k + return w; } @@ -80,6 +84,7 @@ opt->use_asXa = d->ck_asXa->isChecked(); opt->use_asOffline = d->ck_asOffline->isChecked(); opt->asMessage = d->te_asMessage->text(); + opt->eaMessage = d->te_eaMessage->text(); // k } void OptionsTabPresenceAuto::restoreOptions(const Options *opt) @@ -104,6 +109,7 @@ d->ck_asXa->setChecked( opt->use_asXa ); d->ck_asOffline->setChecked( opt->use_asOffline ); d->te_asMessage->setText( opt->asMessage ); + d->te_eaMessage->setText( opt->eaMessage ); // k } //---------------------------------------------------------------------------- diff -Naur psi-0.10-test3-orig/src/options/opt_status.cpp psi-0.10-test3/src/options/opt_status.cpp --- psi-0.10-test3-orig/src/options/opt_status.cpp 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/options/opt_status.cpp 2005-12-01 21:49:41.000000000 +0000 @@ -56,6 +56,10 @@ tr("Specifies an extended message to use if you allow Psi" " to set your status automatically. See options above.")); + QWhatsThis::add(d->te_eaMessage, + tr("Specifies an extended message to use if you set" + " Emergency Away Status.")); // k + d->pb_spNew->setEnabled(TRUE); d->pb_spDelete->setEnabled(FALSE); d->te_sp->setEnabled(FALSE); @@ -106,6 +110,7 @@ opt->use_asWhileDnd = d->ck_asWhileDnd->isChecked(); opt->use_asMessage = d->ck_asMessage->isChecked(); opt->asMessage = d->te_asMessage->text(); + opt->eaMessage = d->te_eaMessage->text(); // k opt->clLogStatus = d->ck_LogStatus->isChecked(); opt->clLogEmptyStatus = d->ck_LogEmptyStatus->isChecked(); @@ -141,6 +146,7 @@ d->ck_asMessage->setChecked( opt->use_asMessage ); d->te_asMessage->setEnabled( opt->use_asMessage ); d->te_asMessage->setText( opt->asMessage ); + d->te_eaMessage->setText( opt->eaMessage ); // k d->ck_LogStatus->setChecked( opt->clLogStatus ); d->ck_LogEmptyStatus->setEnabled( opt->clLogStatus ); d->ck_LogEmptyStatus->setChecked( opt->clLogEmptyStatus ); diff -Naur psi-0.10-test3-orig/src/options/opt_status-ui.ui psi-0.10-test3/src/options/opt_status-ui.ui --- psi-0.10-test3-orig/src/options/opt_status-ui.ui 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/options/opt_status-ui.ui 2005-12-01 21:49:41.000000000 +0000 @@ -194,6 +194,28 @@ + + + + TextLabel1_8ea + + + Emergency Away Status Message: + + + + + te_eaMessage + + + + 32767 + 50 + + + + + groupBox10 @@ -353,6 +375,7 @@ ck_asOffline sb_asOffline te_asMessage + te_eaMessage lb_sp pb_spNew pb_spDelete diff -Naur psi-0.10-test3-orig/src/psiaccount.cpp psi-0.10-test3/src/psiaccount.cpp --- psi-0.10-test3-orig/src/psiaccount.cpp 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/psiaccount.cpp 2005-12-01 22:21:33.000000000 +0000 @@ -402,6 +402,7 @@ notifyOnlineOk = false; doReconnect = false; usingAutoStatus = false; + usingEmergencyStatus = false; // k presenceSent = false; d->loginStatus = Status("", ""); @@ -1750,6 +1751,7 @@ // cancel auto-status and reconnect usingAutoStatus = false; + usingEmergencyStatus = false; // k doReconnect = false; Status s = _s; @@ -1860,6 +1862,68 @@ } } +// k +void PsiAccount::setEmergencyStatus() +{ + if(!usingEmergencyStatus) { + d->origStatus = d->loginStatus; + setStatus(Status("away", expandStatusTemplate(option.eaMessage), d->acc.priority)); + usingEmergencyStatus = true; + QPtrListIterator it(d->dialogList); + for(item_dialog2 *i; (i = it.current()); ++it) { + if ( i->className == "ChatDlg" ) { + ChatDlg *dlg = (ChatDlg*)(i->widget); + if ( dlg ) + dlg->toggleEmergencyAwayStatus(true); + + } + } + } else if(usingEmergencyStatus) { + setStatus(d->origStatus); + usingEmergencyStatus = false; + QPtrListIterator it(d->dialogList); + for(item_dialog2 *i; (i = it.current()); ++it) { + if ( i->className == "ChatDlg" ) { + ChatDlg *dlg = (ChatDlg*)(i->widget); + if ( dlg ) + dlg->toggleEmergencyAwayStatus(false); + } + } + } +} +// k +bool PsiAccount::getEmergencyAwayStatusStatus() { + return usingEmergencyStatus; +} + +QString PsiAccount::expandStatusTemplate(const QString &statusTemplate) +{ + QString res; + + QRegExp rx("<([^:]*):originalStatus:([^>]*)>"); + rx.setCaseSensitive(false); + + const QString orig = d->origStatus.status(); + + int start = 0; + int end = 0; + + while ( (start=rx.search(statusTemplate, end)) != -1 ) { + res += statusTemplate.mid(end, start-end); + + if ( !orig.isEmpty() ) { + res += rx.cap(1); + res += orig; + res += rx.cap(2); + } + + end = start + rx.matchedLength(); + } + res += statusTemplate.mid(end); + + return res; +} + void PsiAccount::secondsIdle(int x) { if(!loggedIn()) @@ -1890,22 +1954,23 @@ if(option.use_asOffline && option.asOffline > 0 && minutes >= option.asOffline) { lastStatus = Status("", "", d->acc.priority, false); usingAutoStatus = false; + usingEmergencyStatus = false; // k logout(); } else if(option.use_asXa && option.asXa > 0 && minutes >= option.asXa) { if(ls.show() != "xa" && lastStatus.show() != "xa") { - lastStatus = Status("xa", (option.use_asMessage)? option.asMessage : status().status(), d->acc.priority); if(!usingAutoStatus) d->origStatus = d->loginStatus; + lastStatus = Status("xa", expandStatusTemplate((option.use_asMessage)? option.asMessage : status().status()), d->acc.priority); setStatusDirect(lastStatus); usingAutoStatus = true; } } else if(option.use_asAway && option.asAway > 0 && minutes >= option.asAway) { if(ls.show() != "away" && lastStatus.show() != "away") { - lastStatus = Status("away", (option.use_asMessage)? option.asMessage : status().status(), d->acc.priority); if(!usingAutoStatus) d->origStatus = d->loginStatus; + lastStatus = Status("away", expandStatusTemplate((option.use_asMessage)? option.asMessage : status().status()), d->acc.priority); setStatusDirect(lastStatus); usingAutoStatus = true; } diff -Naur psi-0.10-test3-orig/src/psiaccount.h psi-0.10-test3/src/psiaccount.h --- psi-0.10-test3-orig/src/psiaccount.h 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/psiaccount.h 2005-12-01 21:49:41.000000000 +0000 @@ -157,6 +157,8 @@ Status status() const; void setStatusDirect(const Status &); void setStatusActual(const Status &); + void setEmergencyStatus(); // k + bool getEmergencyAwayStatusStatus(); // k void login(); void logout(bool fast=false, const Status &s = Status("", "Logged out", 0, false)); bool loggedIn() const; @@ -238,6 +240,7 @@ public slots: void setStatus(const Status &); + QString expandStatusTemplate(const QString &statusTemplate); void secondsIdle(int); void openNextEvent(); @@ -390,7 +393,7 @@ EventDlg *ensureEventDlg(const Jid &); friend class PsiCon; - bool isDisconnecting, notifyOnlineOk, doReconnect, usingAutoStatus, rosterDone, presenceSent, v_isActive; + bool isDisconnecting, notifyOnlineOk, doReconnect, usingAutoStatus, usingEmergencyStatus, rosterDone, presenceSent, v_isActive; // k void cleanupStream(); QString expandQuoteHeadlineTemplate(const Template &headerTemplate, diff -Naur psi-0.10-test3-orig/src/psicon.cpp psi-0.10-test3/src/psicon.cpp --- psi-0.10-test3-orig/src/psicon.cpp 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/psicon.cpp 2005-12-01 21:49:41.000000000 +0000 @@ -1000,6 +1000,27 @@ pa->setStatus(s); } +// k +void PsiCon::setEmergencyStatus() +{ + // Check whether all accounts are logged off + bool allOffline = true; + PsiAccountListIt i(d->listEnabled); + PsiAccount *pa; + for( ; (pa = i.current()); ++i) { + if ( pa->isActive() ) { + allOffline = false; + break; + } + } + + // globally set each account which is logged in + PsiAccountListIt it(d->listEnabled); + for( ; (pa = it.current()); ++it) + if (allOffline || pa->isActive()) + pa->setEmergencyStatus(); +} + void PsiCon::pa_updatedActivity() { PsiAccount *pa = (PsiAccount *)sender(); diff -Naur psi-0.10-test3-orig/src/psicon.h psi-0.10-test3/src/psicon.h --- psi-0.10-test3-orig/src/psicon.h 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/psicon.h 2005-12-01 21:49:41.000000000 +0000 @@ -163,6 +163,7 @@ public slots: void setGlobalStatus(const Status &); + void setEmergencyStatus(); // k QWidget *doToolbars(); private slots: diff -Naur psi-0.10-test3-orig/src/psi_profiles.cpp psi-0.10-test3/src/psi_profiles.cpp --- psi-0.10-test3-orig/src/psi_profiles.cpp 2005-12-01 21:48:43.000000000 +0000 +++ psi-0.10-test3/src/psi_profiles.cpp 2005-12-01 22:21:50.000000000 +0000 @@ -380,6 +380,7 @@ prefs.use_asOffline = FALSE; prefs.use_asMessage = TRUE; prefs.asMessage = QObject::tr("Auto Status (idle)"); + prefs.eaMessage = QObject::tr("Emergency away! BRB.<\n-- \n:originalStatus:>"); prefs.scrollTo = TRUE; prefs.useStatusLinebreak = true; prefs.smShowResource = false; @@ -1076,6 +1077,12 @@ tag.appendChild(textTag(doc, "LogEmptyStatus", prefs.clLogEmptyStatus)); } { + QDomElement tag = doc.createElement("emergencyAwayStatus"); + p_pres.appendChild(tag); + + tag.appendChild(textTag(doc, "message", prefs.eaMessage)); + } + { p_pres.appendChild(prefs.sp.toXml(doc, "statuspresets")); } { @@ -1921,6 +1928,11 @@ readEntry(tag, "message", &prefs.asMessage); } + // k + tag = findSubTag(p_pres, "emergencyAwayStatus", &found); + if(found) + readEntry(tag, "message", &prefs.eaMessage); + tag = findSubTag(p_pres, "statuspresets", &found); if(found) prefs.sp.fromXml(tag);