Bug Low EXT-5194 SLURL field dropdown should display empty menu rather than do nothing when empty

Solution:
Button of dropdown list will be disabled if there are no items in location history

--HG--
branch : product-engine
master
Denis Serdjuk 2010-02-25 19:15:59 +02:00
parent 087ea1cef6
commit e235e71b90
5 changed files with 37 additions and 17 deletions

View File

@ -63,6 +63,7 @@ void LLLocationHistory::addItem(const LLLocationHistoryItem& item) {
mItems.erase(mItems.begin(), mItems.end()-max_items);
}
llassert((S32)mItems.size() <= max_items);
mChangedSignal(ADD);
}
/*
@ -87,9 +88,10 @@ bool LLLocationHistory::touchItem(const LLLocationHistoryItem& item) {
void LLLocationHistory::removeItems()
{
mItems.clear();
mChangedSignal(CLEAR);
}
bool LLLocationHistory::getMatchingItems(std::string substring, location_list_t& result) const
bool LLLocationHistory::getMatchingItems(const std::string& substring, location_list_t& result) const
{
// *TODO: an STL algorithm would look nicer
result.clear();
@ -160,7 +162,7 @@ void LLLocationHistory::load()
return;
}
removeItems();
mItems.clear();// need to use a direct call of clear() method to avoid signal invocation
// add each line in the file to the list
std::string line;
@ -179,5 +181,5 @@ void LLLocationHistory::load()
file.close();
mLoadedSignal();
mChangedSignal(LOAD);
}

View File

@ -111,9 +111,16 @@ class LLLocationHistory: public LLSingleton<LLLocationHistory>
LOG_CLASS(LLLocationHistory);
public:
enum EChangeType
{
ADD
,CLEAR
,LOAD
};
typedef std::vector<LLLocationHistoryItem> location_list_t;
typedef boost::function<void()> loaded_callback_t;
typedef boost::signals2::signal<void()> loaded_signal_t;
typedef boost::function<void(EChangeType event)> history_changed_callback_t;
typedef boost::signals2::signal<void(EChangeType event)> history_changed_signal_t;
LLLocationHistory();
@ -122,8 +129,8 @@ public:
void removeItems();
size_t getItemCount() const { return mItems.size(); }
const location_list_t& getItems() const { return mItems; }
bool getMatchingItems(std::string substring, location_list_t& result) const;
boost::signals2::connection setLoadedCallback(loaded_callback_t cb) { return mLoadedSignal.connect(cb); }
bool getMatchingItems(const std::string& substring, location_list_t& result) const;
boost::signals2::connection setChangedCallback(history_changed_callback_t cb) { return mChangedSignal.connect(cb); }
void save() const;
void load();
@ -133,7 +140,7 @@ private:
location_list_t mItems;
std::string mFilename; /// File to store the history to.
loaded_signal_t mLoadedSignal;
history_changed_signal_t mChangedSignal;
};
#endif

View File

@ -52,7 +52,6 @@
#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
#include "lllocationhistory.h"
#include "llteleporthistory.h"
#include "llsidetray.h"
#include "llslurl.h"
@ -377,9 +376,10 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
// - Update the location string on parcel change.
mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
boost::bind(&LLLocationInputCtrl::onAgentParcelChange, this));
mLocationHistoryConnection = LLLocationHistory::getInstance()->setLoadedCallback(
boost::bind(&LLLocationInputCtrl::onLocationHistoryLoaded, this));
// LLLocationHistory instance is being created before the location input control, so we have to update initial state of button manually.
mButton->setEnabled(LLLocationHistory::instance().getItemCount() > 0);
mLocationHistoryConnection = LLLocationHistory::getInstance()->setChangedCallback(
boost::bind(&LLLocationInputCtrl::onLocationHistoryChanged, this,_1));
mRemoveLandmarkObserver = new LLRemoveLandmarkObserver(this);
mAddLandmarkObserver = new LLAddLandmarkObserver(this);
@ -620,9 +620,13 @@ void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm)
updateAddLandmarkButton();
}
void LLLocationInputCtrl::onLocationHistoryLoaded()
void LLLocationInputCtrl::onLocationHistoryChanged(LLLocationHistory::EChangeType event)
{
rebuildLocationHistory();
if(event == LLLocationHistory::LOAD)
{
rebuildLocationHistory();
}
mButton->setEnabled(LLLocationHistory::instance().getItemCount() > 0);
}
void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
@ -893,7 +897,7 @@ void LLLocationInputCtrl::positionMaturityIcon()
mMaturityIcon->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);
}
void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
void LLLocationInputCtrl::rebuildLocationHistory(const std::string& filter)
{
LLLocationHistory::location_list_t filtered_items;
const LLLocationHistory::location_list_t* itemsp = NULL;

View File

@ -36,6 +36,7 @@
#include "llcombobox.h"
#include "lliconctrl.h" // Params
#include "lltextbox.h" // Params
#include "lllocationhistory.h"
class LLLandmark;
@ -137,7 +138,7 @@ private:
void refreshHealth();
void positionMaturityIcon();
void rebuildLocationHistory(std::string filter = "");
void rebuildLocationHistory(const std::string& filter = LLStringUtil::null);
bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
void setText(const LLStringExplicit& text);
void updateAddLandmarkButton();
@ -147,7 +148,7 @@ private:
void changeLocationPresentation();
void onInfoButtonClicked();
void onLocationHistoryLoaded();
void onLocationHistoryChanged(LLLocationHistory::EChangeType event);
void onLocationPrearrange(const LLSD& data);
void onTextEditorRightClicked(S32 x, S32 y, MASK mask);
void onLandmarkLoaded(LLLandmark* lm);

View File

@ -451,6 +451,12 @@ void LLNavigationBar::onLocationSelection()
return;
//get selected item from combobox item
LLSD value = mCmbLocation->getSelectedValue();
if(value.isUndefined() && !mCmbLocation->getTextEntry()->isDirty())
{
// At this point we know that: there is no selected item in list and text field has NOT been changed
// So there is no sense to try to change the location
return;
}
/* since navbar list support autocompletion it contains several types of item: landmark, teleport hystory item,
* typed by user slurl or region name. Let's find out which type of item the user has selected
* to make decision about adding this location into typed history. see mSaveToLocationHistory