summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llfolderviewitem.cpp6
-rw-r--r--indra/newview/llfolderviewitem.h4
-rw-r--r--indra/newview/llinventorybridge.cpp20
-rw-r--r--indra/newview/llinventorybridge.h1
-rw-r--r--indra/newview/llpanelmaininventory.cpp54
-rw-r--r--indra/newview/llpanelmaininventory.h2
-rw-r--r--indra/newview/llpreviewtexture.cpp32
-rw-r--r--indra/newview/llpreviewtexture.h3
-rw-r--r--indra/newview/llviewerinventory.cpp19
-rw-r--r--indra/newview/llviewerinventory.h3
-rw-r--r--indra/newview/llviewermenufile.cpp26
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_texture.xml11
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml9
13 files changed, 117 insertions, 73 deletions
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 5bef306485..fe793fbcb8 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -40,6 +40,7 @@
#include "llinventoryfilter.h"
#include "llpanel.h"
#include "llviewercontrol.h" // gSavedSettings
+#include "llviewerinventory.h"
#include "llviewerwindow.h" // Argh, only for setCursor()
// linden library includes
@@ -603,6 +604,11 @@ const std::string& LLFolderViewItem::getSearchableLabel() const
return mSearchableLabel;
}
+LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void)
+{
+ return gInventory.getItem(getListener()->getUUID());
+}
+
std::string LLFolderViewItem::getName( void ) const
{
if(mListener)
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 0ea031108b..43a5fd8de5 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -45,6 +45,7 @@ class LLFolderViewListenerFunctor;
class LLInventoryFilter;
class LLMenuGL;
class LLUIImage;
+class LLViewerInventoryItem;
// These are grouping of inventory types.
// Order matters when sorting system folders to the top.
@@ -281,6 +282,9 @@ public:
const LLFolderViewEventListener* getListener( void ) const { return mListener; }
LLFolderViewEventListener* getListener( void ) { return mListener; }
+
+ // Gets the inventory item if it exists (null otherwise)
+ LLViewerInventoryItem * getInventoryItem(void);
// just rename the object.
void rename(const std::string& new_name);
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 3746e9cfeb..52ebefabea 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3150,6 +3150,22 @@ void LLTextureBridge::openItem()
}
}
+bool LLTextureBridge::canSaveTexture(void)
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if(!model)
+ {
+ return false;
+ }
+
+ const LLViewerInventoryItem *item = model->getItem(mUUID);
+ if (item)
+ {
+ return item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ }
+ return false;
+}
+
void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
@@ -3174,6 +3190,10 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Texture Separator"));
items.push_back(std::string("Save As"));
+ if (!canSaveTexture())
+ {
+ disabled_items.push_back(std::string("Save As"));
+ }
}
hide_context_entries(menu, items, disabled_items);
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 63be9dcdb8..5e4e89a71b 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -377,6 +377,7 @@ public:
protected:
LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) :
LLItemBridge(inventory, uuid), mInvType(type) {}
+ bool canSaveTexture(void);
LLInventoryType::EType mInvType;
};
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 21627e84ff..cef21e85d6 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llpanelmaininventory.h"
+#include "llagent.h"
#include "lldndbutton.h"
#include "llfilepicker.h"
#include "llfloaterinventory.h"
@@ -863,7 +864,6 @@ void LLPanelMainInventory::initListCommandsHandlers()
mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
}
void LLPanelMainInventory::updateListCommands()
@@ -909,6 +909,22 @@ void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
}
+void LLPanelMainInventory::saveTexture(const LLSD& userdata)
+{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+
+ const LLUUID& item_id = current_item->getListener()->getUUID();
+ LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
+ if (preview_texture)
+ {
+ preview_texture->openToSave();
+ }
+}
+
void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
if (!isActionEnabled(userdata))
@@ -953,18 +969,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
if (command_name == "save_texture")
{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
-
- const LLUUID& item_id = current_item->getListener()->getUUID();
- LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
- if (preview_texture)
- {
- preview_texture->openToSave();
- }
+ saveTexture(userdata);
}
// This doesn't currently work, since the viewer can't change an assetID an item.
if (command_name == "regenerate_link")
@@ -1008,6 +1013,22 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
}
+bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
+{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ LLViewerInventoryItem *inv_item = current_item->getInventoryItem();
+ if(inv_item)
+ {
+ bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ LLInventoryType::EType curr_type = current_item->getListener()->getInventoryType();
+ return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);
+ }
+ }
+ return false;
+}
+
BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
{
const std::string command_name = userdata.asString();
@@ -1035,12 +1056,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
}
if (command_name == "save_texture")
{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (current_item)
- {
- return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE);
- }
- return FALSE;
+ return isSaveTextureEnabled(userdata);
}
if (command_name == "find_original")
{
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index ae78d3bec8..92443df369 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -110,6 +110,8 @@ protected:
void doCreate(const LLSD& userdata);
void resetFilters();
void setSortBy(const LLSD& userdata);
+ void saveTexture(const LLSD& userdata);
+ bool isSaveTextureEnabled(const LLSD& userdata);
private:
LLFloaterInventoryFinder* getFinder();
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 698f6152b4..26694ac433 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -76,29 +76,12 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)
mAspectRatio(0.f),
mPreviewToSave(FALSE)
{
- const LLInventoryItem *item = getItem();
+ const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
if(item)
{
mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
mImageID = item->getAssetUUID();
- const LLPermissions& perm = item->getPermissions();
- U32 mask = PERM_NONE;
- if(perm.getOwner() == gAgent.getID())
- {
- mask = perm.getMaskBase();
- }
- else if(gAgent.isInGroup(perm.getGroup()))
- {
- mask = perm.getMaskGroup();
- }
- else
- {
- mask = perm.getMaskEveryone();
- }
- if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
- {
- mIsCopyable = TRUE;
- }
+ mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
}
else // not an item, assume it's an asset id
{
@@ -145,6 +128,9 @@ BOOL LLPreviewTexture::postBuild()
childSetVisible("Discard", false);
}
+ childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this);
+ childSetVisible("save_tex_btn", canSaveAs());
+
if (!mCopyToInv)
{
const LLInventoryItem* item = getItem();
@@ -164,6 +150,13 @@ BOOL LLPreviewTexture::postBuild()
return LLPreview::postBuild();
}
+// static
+void LLPreviewTexture::onSaveAsBtn(void* data)
+{
+ LLPreviewTexture* self = (LLPreviewTexture*)data;
+ self->saveAs();
+}
+
void LLPreviewTexture::draw()
{
if (mUpdateDimensions)
@@ -576,6 +569,7 @@ void LLPreviewTexture::loadAsset()
mImage->forceToSaveRawImage(0) ;
mAssetStatus = PREVIEW_ASSET_LOADING;
updateDimensions();
+ childSetVisible("save_tex_btn", canSaveAs());
}
LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index 9b3c91d831..980aecee6d 100644
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -58,7 +58,6 @@ public:
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
virtual void onFocusReceived();
- static void saveToFile(void* userdata);
static void onFileLoadedForSave(
BOOL success,
LLViewerFetchedTexture *src_vi,
@@ -68,6 +67,8 @@ public:
BOOL final,
void* userdata );
void openToSave();
+
+ static void onSaveAsBtn(void* data);
protected:
void init();
/* virtual */ BOOL postBuild();
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 9856cb2b7f..78cee15384 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1379,6 +1379,25 @@ LLViewerInventoryCategory *LLViewerInventoryItem::getLinkedCategory() const
return NULL;
}
+bool LLViewerInventoryItem::checkPermissionsSet(PermissionMask mask) const
+{
+ const LLPermissions& perm = getPermissions();
+ PermissionMask curr_mask = PERM_NONE;
+ if(perm.getOwner() == gAgent.getID())
+ {
+ curr_mask = perm.getMaskBase();
+ }
+ else if(gAgent.isInGroup(perm.getGroup()))
+ {
+ curr_mask = perm.getMaskGroup();
+ }
+ else
+ {
+ curr_mask = perm.getMaskEveryone();
+ }
+ return ((curr_mask & mask) == mask);
+}
+
//----------
void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name)
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 0156e7dab1..412a2c66e6 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -158,6 +158,9 @@ public:
bool getIsBrokenLink() const; // true if the baseitem this points to doesn't exist in memory.
LLViewerInventoryItem *getLinkedItem() const;
LLViewerInventoryCategory *getLinkedCategory() const;
+
+ // Checks the items permissions (for owner, group, or everyone) and returns true if all mask bits are set.
+ bool checkPermissionsSet(PermissionMask mask) const;
// callback
void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name);
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 4b0dc8f668..a1c3806b27 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -71,15 +71,6 @@
// system libraries
#include <boost/tokenizer.hpp>
-class LLFileEnableSaveAs : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs();
- return new_value;
- }
-};
-
class LLFileEnableUpload : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -386,19 +377,6 @@ class LLFileCloseAllWindows : public view_listener_t
}
};
-class LLFileSaveTexture : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLFloater* top = gFloaterView->getFrontmost();
- if (top)
- {
- top->saveAs();
- }
- return true;
- }
-};
-
class LLFileTakeSnapshotToDisk : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -1050,10 +1028,10 @@ void init_menu_file()
view_listener_t::addCommit(new LLFileCloseAllWindows(), "File.CloseAllWindows");
view_listener_t::addEnable(new LLFileEnableCloseWindow(), "File.EnableCloseWindow");
view_listener_t::addEnable(new LLFileEnableCloseAllWindows(), "File.EnableCloseAllWindows");
- view_listener_t::addCommit(new LLFileSaveTexture(), "File.SaveTexture");
view_listener_t::addCommit(new LLFileTakeSnapshotToDisk(), "File.TakeSnapshotToDisk");
view_listener_t::addCommit(new LLFileQuit(), "File.Quit");
view_listener_t::addEnable(new LLFileEnableUpload(), "File.EnableUpload");
- view_listener_t::addEnable(new LLFileEnableSaveAs(), "File.EnableSaveAs");
+
+ // "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled.
}
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index 52a19ac6b3..602a18ea56 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -61,7 +61,16 @@
name="Discard"
top_delta="0"
width="100" />
- <text
+ <button
+ follows="left|bottom"
+ height="22"
+ label="Save As"
+ layout="topleft"
+ left_pad="5"
+ name="save_tex_btn"
+ top_delta="0"
+ width="100" />
+ <text
type="string"
length="1"
follows="left|bottom"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 861b0de2cf..5da88ff171 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1200,15 +1200,6 @@
function="ToggleControl"
parameter="CompressSnapshotsToDisk" />
</menu_item_check>
- <menu_item_call
- label="Save Texture As"
- layout="topleft"
- name="Save Texture As">
- <menu_item_call.on_click
- function="File.SaveTexture" />
- <menu_item_call.on_enable
- function="File.EnableSaveAs" />
- </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu