diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 9aa5e5380f..e82da618c7 100755 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -300,6 +300,8 @@ public: void setMaxSelectable(U32 max_selected) { mMaxSelectable = max_selected; } S32 getMaxSelectable() { return mMaxSelectable; } + // Convenience method + LLScrollbar* getScrollbar() const { return mScrollbar; } virtual S32 getScrollPos() const; virtual void setScrollPos( S32 pos ); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c2f9fbf977..f3edbd2166 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -23171,6 +23171,17 @@ Change of this parameter will affect the layout of buttons in notification toast Value 1 + FSAlwaysTrackPayments + + Comment + Always track payments even if the money tracker is closed + Persist + 1 + Type + Boolean + Value + 0 + diff --git a/indra/newview/fsmoneytracker.cpp b/indra/newview/fsmoneytracker.cpp index 150edba7da..8cccd79d3e 100644 --- a/indra/newview/fsmoneytracker.cpp +++ b/indra/newview/fsmoneytracker.cpp @@ -2,8 +2,9 @@ * @file fsmoneytracker.cpp * @brief Tip Tracker Window * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Copyright (c) 2011 Arrehn Oberlander + * Copyright (c) 2015 Ansariel Hiller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,69 +19,84 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA + * http://www.firestormviewer.org * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" -#include "fschathistory.h" + #include "fsmoneytracker.h" -#include "llviewercontrol.h" + +#include "llclipboard.h" +#include "llfloaterreg.h" +#include "llnamelistctrl.h" +#include "llslurl.h" #include "lltrans.h" +#include "llviewercontrol.h" -FSMoneyTracker::FSMoneyTracker(const LLSD& seed) -: LLFloater(seed) +FSMoneyTracker::FSMoneyTracker(const LLSD& key) +: LLFloater(key) { } -FSMoneyTracker::~FSMoneyTracker() -{ - if (mTransactionHistory) - mTransactionHistory->clear(); -} - BOOL FSMoneyTracker::postBuild() { - mTransactionHistory = getChild("money_chat_history"); - mTransactionHistory->clear(); + mTransactionHistory = getChild("payment_list"); + mTransactionHistory->setContextMenu(&gFSMoneyTrackerListMenu); + clear(); // Button Actions - childSetAction("Clear", boost::bind(&FSMoneyTracker::clear,this)); + childSetAction("Clear", boost::bind(&FSMoneyTracker::clear, this)); return TRUE; } -void FSMoneyTracker::addMessage(const LLChat& chat,bool archive,const LLSD &args) +void FSMoneyTracker::onClose(bool app_quitting) { - LLChat& tmp_chat = const_cast(chat); - tmp_chat.mFromName = chat.mFromName; - LLSD chat_args = args; - chat_args["use_plain_text_chat_history"] = true; - chat_args["show_time"] = true; - if(tmp_chat.mTimeStr.empty()) - tmp_chat.mTimeStr = appendTime(); - - mTransactionHistory->appendMessage(tmp_chat, chat_args); + if (!gSavedSettings.getBOOL("FSAlwaysTrackPayments")) + { + clear(); + } } -std::string FSMoneyTracker::appendTime() +void FSMoneyTracker::addPayment(const LLUUID other_id, bool is_group, S32 amount, bool incoming) { - time_t utc_time; - utc_time = time_corrected(); - std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:[" + LLTrans::getString("TimeMin")+"]"; - - // Attempt to speed up things a little - // if (gSavedSettings.getBOOL("FSSecondsinChatTimestamps")) - static LLCachedControl FSSecondsinChatTimestamps(gSavedSettings, "FSSecondsinChatTimestamps"); - if (FSSecondsinChatTimestamps) - // + S32 scroll_pos = mTransactionHistory->getScrollPos(); + bool at_end = mTransactionHistory->getScrollbar()->isAtEnd(); + + LLNameListCtrl::NameItem item_params; + item_params.value = other_id; + item_params.name = LLTrans::getString("AvatarNameWaiting"); + item_params.target = is_group ? LLNameListCtrl::GROUP : LLNameListCtrl::INDIVIDUAL; + item_params.columns.add().column("time").value(getTime()); + item_params.columns.add().column("name"); + item_params.columns.add().column("amount") + .value((incoming ? amount : -amount)) + .color(LLUIColorTable::instance().getColor((incoming ? "MoneyTrackerIncrease" : "MoneyTrackerDecrease"))); + + mTransactionHistory->addNameItemRow(item_params); + + if (at_end) { - timeStr += ":[" + LLTrans::getString("TimeSec")+"]"; + mTransactionHistory->setScrollPos(scroll_pos + 1); + } +} + +std::string FSMoneyTracker::getTime() +{ + time_t utc_time = time_corrected(); + std::string timeStr = "[" + LLTrans::getString("TimeHour") + "]:[" + LLTrans::getString("TimeMin") + "]"; + + if (gSavedSettings.getBOOL("FSSecondsinChatTimestamps")) + { + timeStr += ":[" + LLTrans::getString("TimeSec") + "]"; } LLSD substitution; - - substitution["datetime"] = (S32) utc_time; - LLStringUtil::format (timeStr, substitution); + substitution["datetime"] = (S32)utc_time; + LLStringUtil::format(timeStr, substitution); return timeStr; } @@ -88,5 +104,80 @@ std::string FSMoneyTracker::appendTime() void FSMoneyTracker::clear() { LL_INFOS() << "Cleared." << LL_ENDL; - mTransactionHistory->clear(); + mTransactionHistory->clearRows(); } + +////////////////////////////////////////////////////////////////////////////// +// FSMoneyTrackerListMenu +////////////////////////////////////////////////////////////////////////////// +LLContextMenu* FSMoneyTrackerListMenu::createMenu() +{ + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + + registrar.add("MoneyTrackerList.Action", boost::bind(&FSMoneyTrackerListMenu::onContextMenuItemClick, this, _2)); + enable_registrar.add("MoneyTrackerList.Enable", boost::bind(&FSMoneyTrackerListMenu::onContextMenuItemEnable, this, _2)); + + return createFromFile("menu_fs_moneytracker_list.xml"); +} + +void FSMoneyTrackerListMenu::onContextMenuItemClick(const LLSD& userdata) +{ + std::string option = userdata.asString(); + + if (option == "copy") + { + FSMoneyTracker* floater = LLFloaterReg::findTypedInstance("money_tracker"); + if (floater) + { + std::string copy_text; + LLNameListCtrl* list = floater->getChild("payment_list"); + + std::vector selected = list->getAllSelected(); + for (std::vector::iterator it = selected.begin(); it != selected.end(); ++it) + { + const LLScrollListItem* item = *it; + copy_text += ( (copy_text.empty() ? "" : "\n") + + item->getColumn(0)->getValue().asString() + ";" + + item->getColumn(1)->getValue().asString() + ";" + + item->getColumn(2)->getValue().asString() + ); + } + + if (!copy_text.empty()) + { + LLClipboard::instance().copyToClipboard(utf8str_to_wstring(copy_text), 0, copy_text.size() ); + } + } + } + else if (option == "delete") + { + FSMoneyTracker* floater = LLFloaterReg::findTypedInstance("money_tracker"); + if (floater) + { + std::string copy_text; + LLNameListCtrl* list = floater->getChild("payment_list"); + + list->operateOnSelection(LLCtrlListInterface::OP_DELETE); + } + } +} + +bool FSMoneyTrackerListMenu::onContextMenuItemEnable(const LLSD& userdata) +{ + std::string item = userdata.asString(); + + if (item == "can_copy" || item == "can_delete") + { + FSMoneyTracker* floater = LLFloaterReg::findTypedInstance("money_tracker"); + if (floater) + { + LLNameListCtrl* list = floater->getChild("payment_list"); + return (list->getNumSelected() > 0); + } + } + + return false; +} + +FSMoneyTrackerListMenu gFSMoneyTrackerListMenu; diff --git a/indra/newview/fsmoneytracker.h b/indra/newview/fsmoneytracker.h index be6173fd99..701016388d 100644 --- a/indra/newview/fsmoneytracker.h +++ b/indra/newview/fsmoneytracker.h @@ -2,8 +2,9 @@ * @file fsmoneytracker.h * @brief Tip Tracker Window * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Copyright (c) 2011 Arrehn Oberlander + * Copyright (c) 2015 Ansariel Hiller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,6 +19,9 @@ * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA + * http://www.firestormviewer.org * $/LicenseInfo$ */ @@ -25,25 +29,35 @@ #define FS_MONEYTRACKER_H #include "llfloater.h" +#include "lllistcontextmenu.h" + +class LLNameListCtrl; -class FSChatHistory; -class LLChat; -class LLTextBox; -class LLViewerRegion; - class FSMoneyTracker: public LLFloater { public: - FSMoneyTracker(const LLSD& seed); - virtual ~FSMoneyTracker(); + FSMoneyTracker(const LLSD& key); + virtual ~FSMoneyTracker() {}; + virtual void onClose(bool app_quitting); BOOL postBuild(); - void addMessage(const LLChat& chat,bool archive,const LLSD &args); + void addPayment(const LLUUID other_id, bool is_group, S32 amount, bool incoming); private: void clear(); - std::string appendTime(); - FSChatHistory* mTransactionHistory; + std::string getTime(); + LLNameListCtrl* mTransactionHistory; }; +class FSMoneyTrackerListMenu : public LLListContextMenu +{ +public: + /*virtual*/ LLContextMenu* createMenu(); +private: + void onContextMenuItemClick(const LLSD& userdata); + bool onContextMenuItemEnable(const LLSD& userdata); +}; + +extern FSMoneyTrackerListMenu gFSMoneyTrackerListMenu; + #endif // FS_MONEYTRACKER_H diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 46c2ffa444..59921a3e61 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -6871,21 +6871,6 @@ static void money_balance_avatar_notify(const LLUUID& agent_id, // Notification is either PaymentReceived or PaymentSent LLNotificationsUtil::add(notification, args, payload); } - - // TipTracker Support - FSMoneyTracker* tipTracker = (FSMoneyTracker*)LLFloaterReg::getInstance("money_tracker"); - if (tipTracker->isShown() || tipTracker->isMinimized()) - { - args["MESSAGE"] = args["SLURLMESSAGE"]; // Always use slurl forms in money tracking - - LLChat chat; - chat.mText = llformat(args["MESSAGE"].asString().c_str(), av_name.getCompleteName().c_str()); - chat.mSourceType = CHAT_SOURCE_SYSTEM; - LLSD chat_args; - tipTracker->addMessage(chat,false,chat_args); - } - // - } static void process_money_balance_reply_extended(LLMessageSystem* msg) @@ -6900,9 +6885,9 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg) S32 amount = 0; std::string item_description; BOOL success = FALSE; - // Ansariel: If we output to chat history and probably console, - // don't create an SLURL for the name or we will end - // up with a SLURL in the console + // If we output to chat history and probably console, + // don't create an SLURL for the name or we will end + // up with a SLURL in the console static LLCachedControl balance_change_in_chat(gSavedSettings, "FSPaymentInfoInChat"); msg->getS32("TransactionInfo", "TransactionType", transaction_type); @@ -7014,7 +6999,7 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg) final_args["MESSAGE"] = message; notification = "PaymentSent"; - //: Additionally, always add a SLURL-enabled form. + // Additionally, always add a SLURL-enabled form. args["NAME"] = dest_slurl; is_name_group = is_dest_group; name_id = dest_id; @@ -7069,7 +7054,7 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg) payload["from_id"] = source_id; notification = "PaymentReceived"; - //: Additionally, always add a SLURL-enabled form. + // Additionally, always add a SLURL-enabled form. args["NAME"] = source_slurl; is_name_group = is_source_group; name_id = source_id; @@ -7082,9 +7067,17 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg) message = LLTrans::getString("paid_you_ldollars_no_reason", args); } final_args["SLURLMESSAGE"] = message; - // + // } + // TipTracker Support + FSMoneyTracker* tipTracker = LLFloaterReg::getTypedInstance("money_tracker"); + if ((tipTracker->isShown() || tipTracker->isMinimized()) || gSavedSettings.getBOOL("FSAlwaysTrackPayments")) + { + tipTracker->addPayment(name_id, is_name_group, amount, !you_paid_someone); + } + // > + // Despite using SLURLs, wait until the name is available before // showing the notification, otherwise the UI layout is strange and // the user sees a "Loading..." message diff --git a/indra/newview/skins/ansastorm/colors.xml b/indra/newview/skins/ansastorm/colors.xml index dc2b5635b1..d25f3d5304 100644 --- a/indra/newview/skins/ansastorm/colors.xml +++ b/indra/newview/skins/ansastorm/colors.xml @@ -1339,4 +1339,10 @@ + + diff --git a/indra/newview/skins/ansastorm/themes/classic_brown/colors.xml b/indra/newview/skins/ansastorm/themes/classic_brown/colors.xml index 724f2ce3ae..5ff3644c2b 100644 --- a/indra/newview/skins/ansastorm/themes/classic_brown/colors.xml +++ b/indra/newview/skins/ansastorm/themes/classic_brown/colors.xml @@ -1339,4 +1339,10 @@ + + diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index a557075d9c..e6725768b4 100755 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -1294,4 +1294,10 @@ + + diff --git a/indra/newview/skins/default/xui/de/floater_fs_money_tracker.xml b/indra/newview/skins/default/xui/de/floater_fs_money_tracker.xml index 4943176d1f..195cab8f46 100644 --- a/indra/newview/skins/default/xui/de/floater_fs_money_tracker.xml +++ b/indra/newview/skins/default/xui/de/floater_fs_money_tracker.xml @@ -1,5 +1,10 @@ - - -