Teleport history now saved to teleport_history.xml. TeleportHistoryMaxEntries specifies how many entries to allow in floater before old entries are dropped.
This commit is contained in:
@@ -9,6 +9,18 @@
|
|||||||
<string>settings_rlv.xml</string>
|
<string>settings_rlv.xml</string>
|
||||||
</array>
|
</array>
|
||||||
|
|
||||||
|
<key>TeleportHistoryMaxEntries</key>
|
||||||
|
<map>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string>Maximum number of entries to allow in teleport history list.</string>
|
||||||
|
<key>Persist</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>S32</string>
|
||||||
|
<key>Value</key>
|
||||||
|
<integer>100</integer>
|
||||||
|
</map>
|
||||||
|
|
||||||
<key>AllowLargeSounds</key>
|
<key>AllowLargeSounds</key>
|
||||||
<map>
|
<map>
|
||||||
<key>Comment</key>
|
<key>Comment</key>
|
||||||
|
|||||||
@@ -79,6 +79,7 @@
|
|||||||
#include "llrender.h"
|
#include "llrender.h"
|
||||||
#include "llfont.h"
|
#include "llfont.h"
|
||||||
#include "llvocache.h"
|
#include "llvocache.h"
|
||||||
|
#include "llfloaterteleporthistory.h"
|
||||||
|
|
||||||
#include "llweb.h"
|
#include "llweb.h"
|
||||||
#include "llsecondlifeurls.h"
|
#include "llsecondlifeurls.h"
|
||||||
@@ -1450,6 +1451,8 @@ bool LLAppViewer::cleanup()
|
|||||||
// Save file- and dirpicker {context, default paths} map.
|
// Save file- and dirpicker {context, default paths} map.
|
||||||
AIFilePicker::saveFile("filepicker_contexts.xml");
|
AIFilePicker::saveFile("filepicker_contexts.xml");
|
||||||
|
|
||||||
|
LLFloaterTeleportHistory::saveFile("teleport_history.xml");
|
||||||
|
|
||||||
// save mute list. gMuteList used to also be deleted here too.
|
// save mute list. gMuteList used to also be deleted here too.
|
||||||
LLMuteList::getInstance()->cache(gAgent.getID());
|
LLMuteList::getInstance()->cache(gAgent.getID());
|
||||||
|
|
||||||
|
|||||||
@@ -49,11 +49,9 @@
|
|||||||
#include "llviewercontrol.h"
|
#include "llviewercontrol.h"
|
||||||
#include "llviewerwindow.h"
|
#include "llviewerwindow.h"
|
||||||
#include "llweb.h"
|
#include "llweb.h"
|
||||||
|
#include "llsdserialize.h"
|
||||||
|
|
||||||
// globals
|
LLFloaterTeleportHistory::LLFloaterTeleportHistory(const LLSD& seed)
|
||||||
LLFloaterTeleportHistory* gFloaterTeleportHistory;
|
|
||||||
|
|
||||||
LLFloaterTeleportHistory::LLFloaterTeleportHistory()
|
|
||||||
: LLFloater(std::string("teleporthistory")),
|
: LLFloater(std::string("teleporthistory")),
|
||||||
mPlacesList(NULL),
|
mPlacesList(NULL),
|
||||||
mID(0)
|
mID(0)
|
||||||
@@ -171,10 +169,18 @@ void LLFloaterTeleportHistory::addEntry(std::string parcelName)
|
|||||||
value["columns"][LIST_SIMSTRING]["value"] = mPendingSimString;
|
value["columns"][LIST_SIMSTRING]["value"] = mPendingSimString;
|
||||||
|
|
||||||
// add the new list entry on top of the list, deselect all and disable the buttons
|
// add the new list entry on top of the list, deselect all and disable the buttons
|
||||||
|
const S32 max_entries = gSavedSettings.getS32("TeleportHistoryMaxEntries");
|
||||||
|
S32 num_entries = mPlacesList->getItemCount();
|
||||||
|
while(num_entries >= max_entries)
|
||||||
|
{
|
||||||
|
mPlacesList->deleteItems(LLSD(mID - num_entries--));
|
||||||
|
}
|
||||||
|
|
||||||
mPlacesList->addElement(value, ADD_TOP);
|
mPlacesList->addElement(value, ADD_TOP);
|
||||||
mPlacesList->deselectAllItems(TRUE);
|
mPlacesList->deselectAllItems(TRUE);
|
||||||
setButtonsEnabled(FALSE);
|
setButtonsEnabled(FALSE);
|
||||||
mID++;
|
mID++;
|
||||||
|
saveFile("teleport_history.xml"); //Comment out to disable saving after every teleport.
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -191,6 +197,95 @@ void LLFloaterTeleportHistory::setButtonsEnabled(BOOL on)
|
|||||||
childSetEnabled("show_on_map", on);
|
childSetEnabled("show_on_map", on);
|
||||||
childSetEnabled("copy_slurl", on);
|
childSetEnabled("copy_slurl", on);
|
||||||
}
|
}
|
||||||
|
//static
|
||||||
|
void LLFloaterTeleportHistory::loadFile(const std::string &file_name)
|
||||||
|
{
|
||||||
|
LLFloaterTeleportHistory *pFloaterHistory = LLFloaterTeleportHistory::findInstance();
|
||||||
|
if(!pFloaterHistory)
|
||||||
|
return;
|
||||||
|
|
||||||
|
LLScrollListCtrl* pScrollList = pFloaterHistory->mPlacesList;
|
||||||
|
if(!pScrollList)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::string temp_str(gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + file_name);
|
||||||
|
|
||||||
|
llifstream file(temp_str);
|
||||||
|
|
||||||
|
if (file.is_open())
|
||||||
|
{
|
||||||
|
llinfos << "Loading "<< file_name << " file at " << temp_str << llendl;
|
||||||
|
LLSD data;
|
||||||
|
LLSDSerialize::fromXML(data, file);
|
||||||
|
if (data.isUndefined())
|
||||||
|
{
|
||||||
|
llinfos << "file missing, ill-formed, "
|
||||||
|
"or simply undefined; not reading the"
|
||||||
|
" file" << llendl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const S32 max_entries = gSavedSettings.getS32("TeleportHistoryMaxEntries");
|
||||||
|
const S32 num_entries = llmin(max_entries,(const S32)data.size());
|
||||||
|
pScrollList->clear();
|
||||||
|
for(S32 i = 0; i < num_entries; i++) //Lower entry = newer
|
||||||
|
{
|
||||||
|
pScrollList->addElement(data[i], ADD_BOTTOM);
|
||||||
|
}
|
||||||
|
pScrollList->deselectAllItems(TRUE);
|
||||||
|
pFloaterHistory->mID = pScrollList->getItemCount();
|
||||||
|
pFloaterHistory->setButtonsEnabled(FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//static
|
||||||
|
void LLFloaterTeleportHistory::saveFile(const std::string &file_name)
|
||||||
|
{
|
||||||
|
LLFloaterTeleportHistory *pFloaterHistory = LLFloaterTeleportHistory::findInstance();
|
||||||
|
if(!pFloaterHistory)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::string temp_str = gDirUtilp->getLindenUserDir(true);
|
||||||
|
if( temp_str.empty() )
|
||||||
|
{
|
||||||
|
llinfos << "Can't save teleport history - no user directory set yet." << llendl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
temp_str += gDirUtilp->getDirDelimiter() + file_name;
|
||||||
|
llofstream export_file(temp_str);
|
||||||
|
if (!export_file.good())
|
||||||
|
{
|
||||||
|
llwarns << "Unable to open " << file_name << " for output." << llendl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
llinfos << "Writing "<< file_name << " file at " << temp_str << llendl;
|
||||||
|
|
||||||
|
LLSD elements;
|
||||||
|
LLScrollListCtrl* pScrollList = pFloaterHistory->mPlacesList;
|
||||||
|
if (pScrollList)
|
||||||
|
{
|
||||||
|
std::vector<LLScrollListItem*> data_list = pScrollList->getAllData();
|
||||||
|
struct SortByAge {
|
||||||
|
bool operator() (LLScrollListItem* i,LLScrollListItem* j) { return (i->getValue().asInteger()>j->getValue().asInteger());}
|
||||||
|
} sorter;
|
||||||
|
std::sort(data_list.begin(),data_list.end(),sorter);//Re-sort. Column sorting may have mucked the list up. Newer entries in front.
|
||||||
|
for (std::vector<LLScrollListItem*>::iterator itr = data_list.begin(); itr != data_list.end(); ++itr)
|
||||||
|
{
|
||||||
|
//Pack into LLSD mimicing one passed to addElement
|
||||||
|
LLSD data_entry;
|
||||||
|
//id is actually reverse of the indexing of the element LLSD. Higher id = newer.
|
||||||
|
data_entry["id"] = pScrollList->getItemCount() - elements.size() - 1;
|
||||||
|
for(S32 i = 0; i < (*itr)->getNumColumns(); ++i)
|
||||||
|
{
|
||||||
|
data_entry["columns"][i]["column"]=pScrollList->getColumn(i)->mName;
|
||||||
|
data_entry["columns"][i]["value"]=(*itr)->getColumn(i)->getValue();
|
||||||
|
}
|
||||||
|
elements.append(data_entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LLSDSerialize::toXML(elements, export_file);
|
||||||
|
export_file.close();
|
||||||
|
}
|
||||||
|
|
||||||
// virtual
|
// virtual
|
||||||
void LLFloaterTeleportHistory::onClose(bool app_quitting)
|
void LLFloaterTeleportHistory::onClose(bool app_quitting)
|
||||||
|
|||||||
@@ -43,10 +43,10 @@
|
|||||||
#include "llfloater.h"
|
#include "llfloater.h"
|
||||||
#include "llscrolllistctrl.h"
|
#include "llscrolllistctrl.h"
|
||||||
|
|
||||||
class LLFloaterTeleportHistory : public LLFloater
|
class LLFloaterTeleportHistory : public LLFloater, public LLUISingleton<LLFloaterTeleportHistory, LLFloaterTeleportHistory>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LLFloaterTeleportHistory();
|
LLFloaterTeleportHistory(const LLSD& seed);
|
||||||
virtual ~LLFloaterTeleportHistory();
|
virtual ~LLFloaterTeleportHistory();
|
||||||
|
|
||||||
/// @brief: reimplemented to check for selection changes in the places list scrolllist
|
/// @brief: reimplemented to check for selection changes in the places list scrolllist
|
||||||
@@ -65,6 +65,8 @@ public:
|
|||||||
/// @brief: adds the destination to the list of visited places
|
/// @brief: adds the destination to the list of visited places
|
||||||
void addEntry(std::string parcelName);
|
void addEntry(std::string parcelName);
|
||||||
|
|
||||||
|
static void loadFile(const std::string &file_name);
|
||||||
|
static void saveFile(const std::string &file_name);
|
||||||
private:
|
private:
|
||||||
enum HISTORY_COLUMN_ORDER
|
enum HISTORY_COLUMN_ORDER
|
||||||
{
|
{
|
||||||
@@ -93,9 +95,21 @@ private:
|
|||||||
std::string mPendingSimString;
|
std::string mPendingSimString;
|
||||||
std::string mPendingTimeString;
|
std::string mPendingTimeString;
|
||||||
std::string mPendingSLURL;
|
std::string mPendingSLURL;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// visibility policy for LLUISingleton
|
||||||
|
static bool visible(LLFloater* instance, const LLSD& key)
|
||||||
|
{
|
||||||
|
return VisibilityPolicy<LLFloater>::visible(instance, key);
|
||||||
|
}
|
||||||
|
static void show(LLFloater* instance, const LLSD& key)
|
||||||
|
{
|
||||||
|
VisibilityPolicy<LLFloater>::show(instance, key);
|
||||||
|
}
|
||||||
|
static void hide(LLFloater* instance, const LLSD& key)
|
||||||
|
{
|
||||||
|
VisibilityPolicy<LLFloater>::hide(instance, key);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// globals
|
|
||||||
extern LLFloaterTeleportHistory* gFloaterTeleportHistory;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -6393,7 +6393,7 @@ class LLShowFloater : public view_listener_t
|
|||||||
}
|
}
|
||||||
else if (floater_name == "teleport history")
|
else if (floater_name == "teleport history")
|
||||||
{
|
{
|
||||||
gFloaterTeleportHistory->setVisible(!gFloaterTeleportHistory->getVisible());
|
LLFloaterTeleportHistory::toggleInstance();
|
||||||
}
|
}
|
||||||
else if (floater_name == "im")
|
else if (floater_name == "im")
|
||||||
{
|
{
|
||||||
@@ -6556,7 +6556,7 @@ class LLFloaterVisible : public view_listener_t
|
|||||||
}
|
}
|
||||||
else if (floater_name == "teleport history")
|
else if (floater_name == "teleport history")
|
||||||
{
|
{
|
||||||
new_value = (gFloaterTeleportHistory && gFloaterTeleportHistory->getVisible());
|
new_value = LLFloaterTeleportHistory::instanceVisible();
|
||||||
}
|
}
|
||||||
else if (floater_name == "im")
|
else if (floater_name == "im")
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3904,7 +3904,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add teleport destination to the list of visited places
|
// add teleport destination to the list of visited places
|
||||||
gFloaterTeleportHistory->addPendingEntry(regionp->getName(), (S16)agent_pos.mV[VX], (S16)agent_pos.mV[VY], (S16)agent_pos.mV[VZ]);
|
LLFloaterTeleportHistory::getInstance()->addPendingEntry(regionp->getName(), (S16)agent_pos.mV[VX], (S16)agent_pos.mV[VY], (S16)agent_pos.mV[VZ]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1546,7 +1546,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add any pending entry to the TP history now that we got the *new* parcel name.
|
// Add any pending entry to the TP history now that we got the *new* parcel name.
|
||||||
gFloaterTeleportHistory->addEntry(LLViewerParcelMgr::getInstance()->getAgentParcelName());
|
LLFloaterTeleportHistory::getInstance()->addEntry(LLViewerParcelMgr::getInstance()->getAgentParcelName());
|
||||||
|
|
||||||
// Handle updating selections, if necessary.
|
// Handle updating selections, if necessary.
|
||||||
if (sequence_id == SELECTED_PARCEL_SEQ_ID)
|
if (sequence_id == SELECTED_PARCEL_SEQ_ID)
|
||||||
|
|||||||
@@ -2005,8 +2005,8 @@ void LLViewerWindow::initWorldUI_postLogin()
|
|||||||
gFloaterWorldMap->setVisible(FALSE);
|
gFloaterWorldMap->setVisible(FALSE);
|
||||||
|
|
||||||
// open teleport history floater and hide it initially
|
// open teleport history floater and hide it initially
|
||||||
gFloaterTeleportHistory = new LLFloaterTeleportHistory();
|
LLFloaterTeleportHistory::getInstance()->setVisible(FALSE);
|
||||||
gFloaterTeleportHistory->setVisible(FALSE);
|
LLFloaterTeleportHistory::loadFile("teleport_history.xml");
|
||||||
|
|
||||||
LLFloaterChatterBox::createInstance(LLSD());
|
LLFloaterChatterBox::createInstance(LLSD());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user