Gave some much-needed love to the message logger and builder, fixed invisible icon in both and added the circuit chooser for the message builder

This commit is contained in:
Hazim Gazov
2010-06-12 01:51:34 +00:00
parent 10a70cb843
commit 9c4f205510
6 changed files with 1027 additions and 871 deletions

View File

@@ -11,8 +11,30 @@
#include "llselectmgr.h" // fill in stuff about selected object
#include "llparcel.h"
#include "llviewerparcelmgr.h" // same for parcel
#include "llscrolllistctrl.h"
#include "llworld.h"
////////////////////////////////
// LLNetListItem
////////////////////////////////
LLNetListItem::LLNetListItem(LLUUID id)
: mID(id),
mAutoName(TRUE),
mName("No name"),
mPreviousRegionName(""),
mCircuitData(NULL)
{
}
////////////////////////////////
// LLFloaterMessageBuilder
////////////////////////////////
std::list<LLNetListItem*> LLFloaterMessageBuilder::sNetListItems;
LLFloaterMessageBuilder::LLFloaterMessageBuilder(std::string initial_text)
: LLFloater(),
LLEventTimer(1.0f),
mNetInfoMode(NI_NET),
mInitialText(initial_text)
{
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_message_builder.xml");
@@ -24,6 +46,119 @@ void LLFloaterMessageBuilder::show(std::string initial_text)
{
(new LLFloaterMessageBuilder(initial_text))->open();
}
BOOL LLFloaterMessageBuilder::tick()
{
refreshNetList();
return FALSE;
}
LLNetListItem* LLFloaterMessageBuilder::findNetListItem(LLHost host)
{
std::list<LLNetListItem*>::iterator end = sNetListItems.end();
for(std::list<LLNetListItem*>::iterator iter = sNetListItems.begin(); iter != end; ++iter)
if((*iter)->mCircuitData && (*iter)->mCircuitData->getHost() == host)
return (*iter);
return NULL;
}
LLNetListItem* LLFloaterMessageBuilder::findNetListItem(LLUUID id)
{
std::list<LLNetListItem*>::iterator end = sNetListItems.end();
for(std::list<LLNetListItem*>::iterator iter = sNetListItems.begin(); iter != end; ++iter)
if((*iter)->mID == id)
return (*iter);
return NULL;
}
void LLFloaterMessageBuilder::refreshNetList()
{
LLScrollListCtrl* scrollp = getChild<LLScrollListCtrl>("net_list");
// Update circuit data of net list items
std::vector<LLCircuitData*> circuits = gMessageSystem->getCircuit()->getCircuitDataList();
std::vector<LLCircuitData*>::iterator circuits_end = circuits.end();
for(std::vector<LLCircuitData*>::iterator iter = circuits.begin(); iter != circuits_end; ++iter)
{
LLNetListItem* itemp = findNetListItem((*iter)->getHost());
if(!itemp)
{
LLUUID id; id.generate();
itemp = new LLNetListItem(id);
sNetListItems.push_back(itemp);
}
itemp->mCircuitData = (*iter);
}
// Clear circuit data of items whose circuits are gone
std::list<LLNetListItem*>::iterator items_end = sNetListItems.end();
for(std::list<LLNetListItem*>::iterator iter = sNetListItems.begin(); iter != items_end; ++iter)
{
if(std::find(circuits.begin(), circuits.end(), (*iter)->mCircuitData) == circuits.end())
(*iter)->mCircuitData = NULL;
}
// Remove net list items that are totally useless now
for(std::list<LLNetListItem*>::iterator iter = sNetListItems.begin(); iter != sNetListItems.end();)
{
if((*iter)->mCircuitData == NULL)
iter = sNetListItems.erase(iter);
else ++iter;
}
// Update names of net list items
items_end = sNetListItems.end();
for(std::list<LLNetListItem*>::iterator iter = sNetListItems.begin(); iter != items_end; ++iter)
{
LLNetListItem* itemp = (*iter);
if(itemp->mAutoName)
{
if(itemp->mCircuitData)
{
LLViewerRegion* regionp = LLWorld::getInstance()->getRegion(itemp->mCircuitData->getHost());
if(regionp)
{
std::string name = regionp->getName();
if(name == "") name = llformat("%s (awaiting region name)", itemp->mCircuitData->getHost().getString().c_str());
itemp->mName = name;
itemp->mPreviousRegionName = name;
}
else
{
itemp->mName = itemp->mCircuitData->getHost().getString();
if(itemp->mPreviousRegionName != "")
itemp->mName.append(llformat(" (was %s)", itemp->mPreviousRegionName.c_str()));
}
}
else
{
// an item just for an event queue, not handled yet
itemp->mName = "Something else";
}
}
}
// Rebuild scroll list from scratch
LLUUID selected_id = scrollp->getFirstSelected() ? scrollp->getFirstSelected()->getUUID() : LLUUID::null;
S32 scroll_pos = scrollp->getScrollPos();
scrollp->clearRows();
for(std::list<LLNetListItem*>::iterator iter = sNetListItems.begin(); iter != items_end; ++iter)
{
LLNetListItem* itemp = (*iter);
LLSD element;
element["id"] = itemp->mID;
LLSD& text_column = element["columns"][0];
text_column["column"] = "text";
text_column["value"] = itemp->mName + (itemp->mCircuitData->getHost() == gAgent.getRegionHost() ? " (main)" : "");
LLSD& state_column = element["columns"][ 1];
state_column["column"] = "state";
state_column["value"] = "";
LLScrollListItem* scroll_itemp = scrollp->addElement(element);
BOOL has_live_circuit = itemp->mCircuitData && itemp->mCircuitData->isAlive();
LLScrollListText* state = (LLScrollListText*)scroll_itemp->getColumn(1);
if(has_live_circuit)
state->setText(std::string("Alive"));
else
state->setText(std::string("Alive"));
}
if(selected_id.notNull()) scrollp->selectByID(selected_id);
if(scroll_pos < scrollp->getItemCount()) scrollp->setScrollPos(scroll_pos);
}
BOOL LLFloaterMessageBuilder::postBuild()
{
childSetText("message_edit", mInitialText);
@@ -785,7 +920,27 @@ void LLFloaterMessageBuilder::onClickSend(void* user_data)
}
}
}
gMessageSystem->sendMessage(gAgent.getRegionHost());
LLScrollListCtrl* scrollp = floaterp->getChild<LLScrollListCtrl>("net_list");
LLScrollListItem* selected_itemp = scrollp->getFirstSelected();
//if a specific circuit is selected, send it to that, otherwise send it to the current sim
if(selected_itemp)
{
LLNetListItem* itemp = findNetListItem(selected_itemp->getUUID());
LLScrollListText* textColumn = (LLScrollListText*)selected_itemp->getColumn(1);
//why would you send data through a dead circuit?
if(textColumn->getValue().asString() == "Dead")
{
LLFloaterChat::addChat(LLChat("No sending messages through dead circuits!"));
return;
}
gMessageSystem->sendMessage(itemp->mCircuitData->getHost());
} else {
gMessageSystem->sendMessage(gAgent.getRegionHost());
}
}
else
{

View File

@@ -2,13 +2,29 @@
#ifndef LL_LLFLOATERMESSAGEBUILDER_H
#define LL_LLFLOATERMESSAGEBUILDER_H
#include "llfloater.h"
class LLFloaterMessageBuilder : public LLFloater
#include "lltemplatemessagereader.h"
#include "llmessagelog.h"
class LLNetListItem
{
public:
LLNetListItem(LLUUID id);
LLUUID mID;
BOOL mAutoName;
std::string mName;
std::string mPreviousRegionName;
LLCircuitData* mCircuitData;
};
class LLFloaterMessageBuilder : public LLFloater, public LLEventTimer
{
public:
LLFloaterMessageBuilder(std::string initial_text);
~LLFloaterMessageBuilder();
static void show(std::string initial_text);
static std::list<LLNetListItem*> sNetListItems;
BOOL postBuild();
BOOL tick();
static BOOL addField(e_message_variable_type var_type, const char* var_name, std::string input, BOOL hex);
static void onClickSend(void* user_data);
static void onCommitPacketCombo(LLUICtrl* ctrl, void* user_data);
@@ -27,6 +43,13 @@ public:
std::string name;
std::vector<parts_var> vars;
};
static LLNetListItem* findNetListItem(LLHost host);
static LLNetListItem* findNetListItem(LLUUID id);
void refreshNetList();
enum ENetInfoMode { NI_NET, NI_LOG };
ENetInfoMode mNetInfoMode;
static void onCommitMessageLog(LLUICtrl* ctrl, void* user_data);
static void onCommitFilter(LLUICtrl* ctrl, void* user_data);
};
#endif
// </edit>

View File

@@ -13,17 +13,6 @@
#include "llfloatermessagebuilder.h"
#include "llagent.h"
////////////////////////////////
// LLNetListItem
////////////////////////////////
LLNetListItem::LLNetListItem(LLUUID id)
: mID(id),
mAutoName(TRUE),
mName("No name"),
mPreviousRegionName(""),
mCircuitData(NULL)
{
}
////////////////////////////////
// LLFloaterMessageLogItem
////////////////////////////////
#define MAX_PACKET_LEN (0x2000)
@@ -619,7 +608,7 @@ void LLFloaterMessageLog::refreshNetList()
LLSD& text_column = element["columns"][0];
text_column["column"] = "text";
text_column["value"] = itemp->mName + (itemp->mCircuitData->getHost() == gAgent.getRegionHost() ? " (main)" : "");
for(int i = 0; i < 3; i++)
for(int i = 0; i < 2; i++)
{
LLSD& icon_column = element["columns"][i + 1];
icon_column["column"] = llformat("icon%d", i);
@@ -630,18 +619,18 @@ void LLFloaterMessageLog::refreshNetList()
BOOL has_live_circuit = itemp->mCircuitData && itemp->mCircuitData->isAlive();
if(has_live_circuit)
{
LLScrollListIcon* icon = (LLScrollListIcon*)scroll_itemp->getColumn(2);
LLScrollListIcon* icon = (LLScrollListIcon*)scroll_itemp->getColumn(1);
icon->setValue("icon_net_close_circuit.tga");
icon->setClickCallback(onClickCloseCircuit, itemp);
}
else
{
LLScrollListIcon* icon = (LLScrollListIcon*)scroll_itemp->getColumn(2);
LLScrollListIcon* icon = (LLScrollListIcon*)scroll_itemp->getColumn(1);
icon->setValue("icon_net_close_circuit_gray.tga");
icon->setClickCallback(NULL, NULL);
}
// Event queue isn't even supported yet... FIXME
LLScrollListIcon* icon = (LLScrollListIcon*)scroll_itemp->getColumn(3);
LLScrollListIcon* icon = (LLScrollListIcon*)scroll_itemp->getColumn(2);
icon->setValue("icon_net_close_eventpoll_gray.tga");
icon->setClickCallback(NULL, NULL);
}

View File

@@ -2,16 +2,8 @@
#include "llfloater.h"
#include "llmessagelog.h"
#include "lltemplatemessagereader.h"
class LLNetListItem
{
public:
LLNetListItem(LLUUID id);
LLUUID mID;
BOOL mAutoName;
std::string mName;
std::string mPreviousRegionName;
LLCircuitData* mCircuitData;
};
#include "llfloatermessagebuilder.h"
class LLFloaterMessageLogItem : public LLMessageLogEntry
{
public:

View File

@@ -3,9 +3,7 @@
<scroll_list column_padding="0" draw_heading="false" follows="left|top|right" left="10" top="-25"
name="net_list" search_column="0" right="-10" bottom="450">
<column dynamicwidth="true" name="text" label="text" />
<column name="icon0" label="icon0" width="24" />
<column name="icon1" label="icon1" width="24" />
<column name="icon2" label="icon2" width="24" />
<column name="state" label="state" width="24" />
</scroll_list>
<combo_box name="untrusted_message_combo" allow_text_entry="false" follows="left|top" left="10" top="-150" right="-370" bottom="433" tool_tip="No trust">
</combo_box>

View File

@@ -5,7 +5,6 @@
<column dynamicwidth="true" name="text" label="text" />
<column name="icon0" label="icon0" width="24" />
<column name="icon1" label="icon1" width="24" />
<column name="icon2" label="icon2" width="24" />
</scroll_list>
<button name="filter_choice_btn" follows="left|top" left="10" top="-150" right="-370" bottom="430" label="…"/>
<line_editor name="filter_edit" follows="left|top|right" left="30" top="-149" right="-28" bottom="430" max_length="65535"/>