CHUI-101 WIP Make LLFolderview general purpose

removed viewer dependencies from folderview code
meow-7.2.2
Richard Linden 2012-07-03 17:05:28 -07:00
parent 7fb39240d0
commit a8defa513c
8 changed files with 36 additions and 163 deletions

View File

@ -27,25 +27,18 @@
#include "llviewerprecompiledheaders.h"
#include "llfolderview.h"
#include "llfolderviewmodel.h"
#include "llclipboard.h" // *TODO: remove this once hack below gone.
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llmenugl.h"
#include "llpanel.h"
#include "llscrollcontainer.h" // hack to allow scrolling
#include "lltextbox.h"
#include "lltrans.h"
#include "llui.h"
#include "lluictrlfactory.h"
// TODO RN: kill these
// newview includes
#include "llcallbacklist.h" // per-frame on-idle
#include "llfloaterproperties.h" // showProperties
#include "llviewerwindow.h" // renamer popup handling
#include "llpreview.h" // openSelectedItems
#include "llinventorypanel.h" // idle loop for filtering, sort order declarations, etc.
// Linden library includes
#include "lldbstrings.h"
#include "llfocusmgr.h"
@ -172,7 +165,6 @@ LLFolderView::LLFolderView(const Params& p)
mNeedsAutoSelect( FALSE ),
mAutoSelectOverride(FALSE),
mNeedsAutoRename(FALSE),
mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME), // This gets overridden by a pref immediately
mShowSelectionContext(FALSE),
mShowSingleSelection(FALSE),
mArrangeGeneration(0),
@ -199,7 +191,6 @@ LLFolderView::LLFolderView(const Params& p)
mAutoOpenTimer.stop();
mKeyboardSelection = FALSE;
mIndentation = p.folder_indentation;
gIdleCallbacks.addFunction(idle, this);
//clear label
// go ahead and render root folder as usual
@ -269,7 +260,6 @@ LLFolderView::~LLFolderView( void )
mStatusTextBox = NULL;
mAutoOpenItems.removeAllNodes();
gIdleCallbacks.deleteFunction(idle, this);
if (mPopupMenuHandle.get()) mPopupMenuHandle.get()->die();
@ -291,16 +281,16 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
{
LLFolderViewFolder::addFolder(folder);
mFolders.remove(folder);
// enforce sort order of My Inventory followed by Library
if (((LLFolderViewModelItemInventory*)folder->getViewModelItem())->getUUID() == gInventory.getLibraryRootFolderID())
{
mFolders.push_back(folder);
}
else
{
mFolders.insert(mFolders.begin(), folder);
}
// TODO RN: enforce sort order of My Inventory followed by Library
//mFolders.remove(folder);
//if (((LLFolderViewModelItemInventory*)folder->getViewModelItem())->getUUID() == gInventory.getLibraryRootFolderID())
//{
// mFolders.push_back(folder);
//}
//else
//{
// mFolders.insert(mFolders.begin(), folder);
//}
return TRUE;
}
@ -754,7 +744,7 @@ void LLFolderView::closeRenamer( void )
if (mRenamer && mRenamer->getVisible())
{
// Triggers onRenamerLost() that actually closes the renamer.
gViewerWindow->removePopup(mRenamer);
LLUI::removePopup(mRenamer);
}
}
@ -785,24 +775,6 @@ bool isDescendantOfASelectedItem(LLFolderViewItem* item, const std::vector<LLFol
return false;
}
// static
void LLFolderView::removeCutItems()
{
// There's no item in "cut" mode on the clipboard -> exit
if (!LLClipboard::instance().isCutMode())
return;
// Get the list of clipboard item uuids and iterate through them
LLDynamicArray<LLUUID> objects;
LLClipboard::instance().pasteFromClipboard(objects);
for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();
iter != objects.end();
++iter)
{
gInventory.removeObject(*iter);
}
}
void LLFolderView::removeSelectedItems()
{
if(getVisible() && getEnabled())
@ -1126,9 +1098,9 @@ void LLFolderView::cut()
if(listener)
{
listener->cutToClipboard();
listener->removeItem();
}
}
LLFolderView::removeCutItems();
}
mSearchString.clear();
}
@ -1222,7 +1194,7 @@ void LLFolderView::startRenamingSelectedItem( void )
// set focus will fail unless item is visible
mRenamer->setFocus( TRUE );
mRenamer->setTopLostCallback(boost::bind(&LLFolderView::onRenamerLost, this));
gViewerWindow->addPopup(mRenamer);
LLUI::addPopup(mRenamer);
}
}
@ -1808,16 +1780,10 @@ static LLFastTimer::DeclareTimer FTM_AUTO_SELECT("Open and Select");
static LLFastTimer::DeclareTimer FTM_INVENTORY("Inventory");
// Main idle routine
void LLFolderView::doIdle()
void LLFolderView::update()
{
// If this is associated with the user's inventory, don't do anything
// until that inventory is loaded up.
const LLInventoryPanel *inventory_panel = dynamic_cast<LLInventoryPanel*>(mParentPanel);
if (inventory_panel && !inventory_panel->getIsViewsInitialized())
{
return;
}
LLFastTimer t2(FTM_INVENTORY);
if (getFolderViewModel()->getFilter()->isModified() && getFolderViewModel()->getFilter()->isNotDefault())
@ -1859,8 +1825,8 @@ void LLFolderView::doIdle()
BOOL filter_finished = getViewModelItem()->passedFilter()
&& mViewModel->contentsReady();
if (filter_finished
|| gFocusMgr.childHasKeyboardFocus(inventory_panel)
|| gFocusMgr.childHasMouseCapture(inventory_panel))
|| gFocusMgr.childHasKeyboardFocus(getParent()) // assume we are inside a scroll container
|| gFocusMgr.childHasMouseCapture(getParent()))
{
// finishing the filter process, giving focus to the folder view, or dragging the scrollbar all stop the auto select process
mNeedsAutoSelect = FALSE;
@ -1919,7 +1885,6 @@ void LLFolderView::doIdle()
constraint_rect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());
}
BOOL is_visible = isInVisibleChain();
if ( is_visible )
@ -1954,17 +1919,6 @@ void LLFolderView::doIdle()
mSignalSelectCallback = FALSE;
}
//static
void LLFolderView::idle(void* user_data)
{
LLFolderView* self = (LLFolderView*)user_data;
if ( self )
{ // Do the real idle
self->doIdle();
}
}
void LLFolderView::dumpSelectionInformation()
{
llinfos << "LLFolderView::dumpSelectionInformation()" << llendl;
@ -1988,7 +1942,7 @@ void LLFolderView::updateRenamerPosition()
screenPointToLocal( x, y, &x, &y );
mRenamer->setOrigin( x, y );
LLRect scroller_rect(0, 0, gViewerWindow->getWindowWidthScaled(), 0);
LLRect scroller_rect(0, 0, LLUI::getWindowSize().mV[VX], 0);
if (mScrollContainer)
{
scroller_rect = mScrollContainer->getContentWindowRect();

View File

@ -165,7 +165,6 @@ public:
// Deletion functionality
void removeSelectedItems();
static void removeCutItems();
// Open the selected item
void openSelectedItems( void );
@ -223,8 +222,7 @@ public:
F32 getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }
bool getUseEllipses() { return mUseEllipses; }
void doIdle(); // Real idle routine
static void idle(void* user_data); // static glue to doIdle()
void update(); // needs to be called periodically (e.g. once per frame)
BOOL needsAutoSelect() { return mNeedsAutoSelect && !mAutoSelectOverride; }
BOOL needsAutoRename() { return mNeedsAutoRename; }
@ -288,7 +286,6 @@ protected:
bool mUseLabelSuffix;
bool mShowItemLinkOverlays;
U32 mSortOrder;
LLDepthStack<LLFolderViewFolder> mAutoOpenItems;
LLFolderViewFolder* mAutoOpenCandidate;
LLFrameTimer mAutoOpenTimer;

View File

@ -1798,16 +1798,6 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
{
/* Disable outfit double click to wear
const LLUUID &cat_uuid = getViewModelItem()->getUUID();
const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid);
if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
{
getViewModelItem()->performAction(NULL, NULL,"replaceoutfit");
return TRUE;
}
*/
BOOL handled = FALSE;
if( isOpen() )
{

View File

@ -28,7 +28,6 @@
#include "llfolderviewmodel.h"
#include "lltrans.h"
#include "llviewercontrol.h"
bool LLFolderViewModelCommon::needsSort(LLFolderViewModelItem* item)
{
@ -49,6 +48,6 @@ std::string LLFolderViewModelCommon::getStatusText()
void LLFolderViewModelCommon::filter()
{
getFilter()->setFilterCount(llclamp(gSavedSettings.getS32("FilterItemsPerFrame"), 1, 5000));
getFilter()->setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000));
mFolderView->getViewModelItem()->filter(*getFilter());
}

View File

@ -27,7 +27,6 @@
#include "llfontgl.h" // just for StyleFlags enum
#include "llfolderview.h"
#include "lltooldraganddrop.h"
// These are grouping of inventory types.
// Order matters when sorting system folders to the top.

View File

@ -1400,7 +1400,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
else if ("cut" == action)
{
cutToClipboard();
LLFolderView::removeCutItems();
gInventory.removeObject(mUUID);
return;
}
else if ("copy" == action)
@ -1680,14 +1680,12 @@ BOOL LLItemBridge::renameItem(const std::string& new_name)
return FALSE;
}
BOOL LLItemBridge::removeItem()
{
if(!isItemRemovable())
{
return FALSE;
}
// move it to the trash
LLPreview::hide(mUUID, TRUE);
@ -2870,7 +2868,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
else if ("cut" == action)
{
cutToClipboard();
LLFolderView::removeCutItems();
gInventory.removeObject(mUUID);
return;
}
else if ("copy" == action)

View File

@ -258,6 +258,8 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
LLInventoryPanel::~LLInventoryPanel()
{
gIdleCallbacks.deleteFunction(idle, this);
U32 sort_order = getFolderViewModel()->getSorter().getSortOrder();
if (mSortOrderSetting != INHERIT_SORT_ORDER)
{
@ -566,12 +568,21 @@ void LLInventoryPanel::onIdle(void *userdata)
}
}
void LLInventoryPanel::idle(void* user_data)
{
LLInventoryPanel* panel = (LLInventoryPanel*)user_data;
panel->mFolderRoot->doIdle();
}
void LLInventoryPanel::initializeViews()
{
if (!gInventory.isInventoryUsable()) return;
rebuildViewsFor(gInventory.getRootFolderID());
gIdleCallbacks.addFunction(idle, this);
mViewsInitialized = true;
openStartFolderOrMyInventory();

View File

@ -45,82 +45,6 @@ class LLInventoryFVBridgeBuilder;
class LLInvPanelComplObserver;
class LLFolderViewModelInventory;
class LLFolderViewModelItemInventory
: public LLFolderViewModelItemCommon
{
public:
LLFolderViewModelItemInventory()
: mRootViewModel(NULL)
{}
void setRootViewModel(LLFolderViewModelInventory* root_view_model)
{
mRootViewModel = root_view_model;
}
virtual const LLUUID& getUUID() const = 0;
virtual time_t getCreationDate() const = 0; // UTC seconds
virtual void setCreationDate(time_t creation_date_utc) = 0;
virtual PermissionMask getPermissionMask() const = 0;
virtual LLFolderType::EType getPreferredType() const = 0;
virtual void showProperties(void) = 0;
virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make into pure virtual.
virtual BOOL isUpToDate() const = 0;
virtual bool hasChildren() const = 0;
virtual LLInventoryType::EType getInventoryType() const = 0;
virtual void performAction(LLInventoryModel* model, std::string action) = 0;
virtual LLWearableType::EType getWearableType() const = 0;
virtual EInventorySortGroup getSortGroup() const = 0;
virtual LLInventoryObject* getInventoryObject() const = 0;
virtual void requestSort();
virtual bool potentiallyVisible();
virtual bool passedFilter(S32 filter_generation = -1);
virtual bool descendantsPassedFilter(S32 filter_generation = -1);
virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation);
virtual bool filter( LLFolderViewFilter& filter);
virtual bool filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
protected:
LLFolderViewModelInventory* mRootViewModel;
};
class LLInventorySort
{
public:
LLInventorySort(U32 order = 0)
: mSortOrder(order),
mByDate(false),
mSystemToTop(false),
mFoldersByName(false)
{
mByDate = (order & LLInventoryFilter::SO_DATE);
mSystemToTop = (order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP);
mFoldersByName = (order & LLInventoryFilter::SO_FOLDERS_BY_NAME);
}
bool isByDate() const { return mByDate; }
U32 getSortOrder() const { return mSortOrder; }
bool operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const;
private:
U32 mSortOrder;
bool mByDate;
bool mSystemToTop;
bool mFoldersByName;
};
class LLFolderViewModelInventory
: public LLFolderViewModel<LLInventorySort, LLFolderViewModelItemInventory, LLFolderViewModelItemInventory, LLInventoryFilter>
{
public:
typedef LLFolderViewModel<LLInventorySort, LLFolderViewModelItemInventory, LLFolderViewModelItemInventory, LLInventoryFilter> base_t;
virtual ~LLFolderViewModelInventory() {}
void sort(LLFolderViewFolder* folder);
bool contentsReady();
};
class LLInventoryPanel : public LLPanel
{
//--------------------------------------------------------------------
@ -232,7 +156,8 @@ public:
void doCreate(const LLSD& userdata);
bool beginIMSession();
bool attachObject(const LLSD& userdata);
static void idle(void* user_data);
// DEBUG ONLY:
static void dumpSelectionInformation(void* user_data);