FIRE-20414 / FIRE-29342: Add management floater for protect folders
parent
22ac7edd6e
commit
e989f521de
|
|
@ -173,6 +173,7 @@ set(viewer_SOURCE_FILES
|
|||
fsfloaterplacedetails.cpp
|
||||
fsfloaterposestand.cpp
|
||||
fsfloaterprofile.cpp
|
||||
fsfloaterprotectedfolders.cpp
|
||||
fsfloaterradar.cpp
|
||||
fsfloatersearch.cpp
|
||||
fsfloaterstatistics.cpp
|
||||
|
|
@ -931,6 +932,7 @@ set(viewer_HEADER_FILES
|
|||
fsfloaterplacedetails.h
|
||||
fsfloaterposestand.h
|
||||
fsfloaterprofile.h
|
||||
fsfloaterprotectedfolders.h
|
||||
fsfloaterradar.h
|
||||
fsfloatersearch.h
|
||||
fsfloaterstatistics.h
|
||||
|
|
|
|||
|
|
@ -0,0 +1,190 @@
|
|||
/**
|
||||
* @file fsfloaterprotectedfolders.cpp
|
||||
* @brief Class for the protected folders floater
|
||||
*
|
||||
* $LicenseInfo:firstyear=2020&license=viewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (c) 2020 Ansariel Hiller @ Second Life
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
|
||||
* http://www.firestormviewer.org
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "fsfloaterprotectedfolders.h"
|
||||
#include "fscommon.h"
|
||||
#include "llbutton.h"
|
||||
#include "llfiltereditor.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
#include "llinventorymodel.h"
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "llviewercontrol.h" // for gSavedSettings
|
||||
#include "rlvactions.h"
|
||||
|
||||
|
||||
FSFloaterProtectedFolders::FSFloaterProtectedFolders(const LLSD& key)
|
||||
: LLFloater(key),
|
||||
mFolderList(NULL),
|
||||
mFilterSubString(LLStringUtil::null),
|
||||
mFilterSubStringOrig(LLStringUtil::null),
|
||||
mProtectedCategoriesChangedCallbackConnection(),
|
||||
mInitialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
FSFloaterProtectedFolders::~FSFloaterProtectedFolders()
|
||||
{
|
||||
if (mProtectedCategoriesChangedCallbackConnection.connected())
|
||||
{
|
||||
mProtectedCategoriesChangedCallbackConnection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
//virtual
|
||||
BOOL FSFloaterProtectedFolders::postBuild()
|
||||
{
|
||||
mFolderList = getChild<LLScrollListCtrl>("folder_list");
|
||||
mFolderList->setFilterColumn(0);
|
||||
mFolderList->setDoubleClickCallback(boost::bind(&FSFloaterProtectedFolders::onDoubleClick, this));
|
||||
|
||||
mRemoveFolderBtn = getChild<LLButton>("remove_btn");
|
||||
mRemoveFolderBtn->setCommitCallback(boost::bind(&FSFloaterProtectedFolders::handleRemove, this));
|
||||
|
||||
mFilterEditor = getChild<LLFilterEditor>("filter_input");
|
||||
mFilterEditor->setCommitCallback(boost::bind(&FSFloaterProtectedFolders::onFilterEdit, this, _2));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void FSFloaterProtectedFolders::onOpen(const LLSD& /*info*/)
|
||||
{
|
||||
if (!mInitialized)
|
||||
{
|
||||
if (!gInventory.isInventoryUsable())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mProtectedCategoriesChangedCallbackConnection = gSavedPerAccountSettings.getControl("FSProtectedFolders")->getCommitSignal()->connect(boost::bind(&FSFloaterProtectedFolders::updateList, this));
|
||||
|
||||
updateList();
|
||||
|
||||
mInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
//virtual
|
||||
void FSFloaterProtectedFolders::draw()
|
||||
{
|
||||
LLFloater::draw();
|
||||
|
||||
mRemoveFolderBtn->setEnabled(mFolderList->getNumSelected() > 0);
|
||||
}
|
||||
|
||||
//virtual
|
||||
BOOL FSFloaterProtectedFolders::handleKeyHere(KEY key, MASK mask)
|
||||
{
|
||||
if (FSCommon::isFilterEditorKeyCombo(key, mask))
|
||||
{
|
||||
mFilterEditor->setFocus(TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return LLFloater::handleKeyHere(key, mask);
|
||||
}
|
||||
|
||||
void FSFloaterProtectedFolders::updateList()
|
||||
{
|
||||
bool needs_sort = mFolderList->isSorted();
|
||||
mFolderList->setNeedsSort(false);
|
||||
mFolderList->clearRows();
|
||||
|
||||
LLSD protected_folders = gSavedPerAccountSettings.getLLSD("FSProtectedFolders");
|
||||
for (LLSD::array_const_iterator it = protected_folders.beginArray(); it != protected_folders.endArray(); ++it)
|
||||
{
|
||||
LLUUID id = (*it).asUUID();
|
||||
LLViewerInventoryCategory* cat = gInventory.getCategory(id);
|
||||
|
||||
LLSD row_data;
|
||||
row_data["value"] = id;
|
||||
row_data["columns"][0]["column"] = "name";
|
||||
row_data["columns"][0]["value"] = cat ? cat->getName() : getString("UnknownFolder");
|
||||
|
||||
LLScrollListItem* row = mFolderList->addElement(row_data);
|
||||
if (!cat)
|
||||
{
|
||||
LLScrollListText* name_column = (LLScrollListText*)row->getColumn(0);
|
||||
name_column->setFontStyle(LLFontGL::NORMAL | LLFontGL::ITALIC);
|
||||
}
|
||||
}
|
||||
|
||||
mFolderList->setNeedsSort(needs_sort);
|
||||
mFolderList->updateSort();
|
||||
}
|
||||
|
||||
void FSFloaterProtectedFolders::handleRemove()
|
||||
{
|
||||
uuid_set_t selected_ids;
|
||||
std::vector<LLScrollListItem*> selected_items = mFolderList->getAllSelected();
|
||||
|
||||
for (std::vector<LLScrollListItem*>::iterator it = selected_items.begin(); it != selected_items.end(); ++it)
|
||||
{
|
||||
selected_ids.insert((*it)->getUUID());
|
||||
}
|
||||
|
||||
LLSD protected_folders = gSavedPerAccountSettings.getLLSD("FSProtectedFolders");
|
||||
LLSD new_protected_folders;
|
||||
for (LLSD::array_const_iterator it = protected_folders.beginArray(); it != protected_folders.endArray(); ++it)
|
||||
{
|
||||
if (selected_ids.find((*it).asUUID()) == selected_ids.end())
|
||||
{
|
||||
new_protected_folders.append(*it);
|
||||
}
|
||||
}
|
||||
gSavedPerAccountSettings.setLLSD("FSProtectedFolders", new_protected_folders);
|
||||
}
|
||||
|
||||
void FSFloaterProtectedFolders::onFilterEdit(const std::string& search_string)
|
||||
{
|
||||
mFilterSubStringOrig = search_string;
|
||||
LLStringUtil::trimHead(mFilterSubStringOrig);
|
||||
// Searches are case-insensitive
|
||||
std::string search_upper = mFilterSubStringOrig;
|
||||
LLStringUtil::toUpper(search_upper);
|
||||
|
||||
if (mFilterSubString == search_upper)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mFilterSubString = search_upper;
|
||||
|
||||
// Apply new filter.
|
||||
mFolderList->setFilterString(mFilterSubStringOrig);
|
||||
}
|
||||
|
||||
void FSFloaterProtectedFolders::onDoubleClick()
|
||||
{
|
||||
LLUUID selected_item_id = mFolderList->getStringUUIDSelectedItem();
|
||||
if (selected_item_id.notNull() && (!RlvActions::isRlvEnabled() || !RlvActions::hasBehaviour(RLV_BHVR_SHOWINV)))
|
||||
{
|
||||
show_item_original(selected_item_id);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
/**
|
||||
* @file fsfloaterprotectedfolders.h
|
||||
* @brief Class for the protected folders floater
|
||||
*
|
||||
* $LicenseInfo:firstyear=2020&license=viewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (c) 2020 Ansariel Hiller @ Second Life
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
|
||||
* http://www.firestormviewer.org
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef FS_FLOATERPROTECTEDFOLDERS_H
|
||||
#define FS_FLOATERPROTECTEDFOLDERS_H
|
||||
|
||||
#include "llfloater.h"
|
||||
|
||||
class LLButton;
|
||||
class LLFilterEditor;
|
||||
class LLScrollListCtrl;
|
||||
|
||||
class FSFloaterProtectedFolders : public LLFloater
|
||||
{
|
||||
public:
|
||||
FSFloaterProtectedFolders(const LLSD& key);
|
||||
virtual ~FSFloaterProtectedFolders();
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void onOpen(const LLSD& info);
|
||||
/*virtual*/ void draw();
|
||||
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
|
||||
/*virtual*/ bool hasAccelerators() const { return true; }
|
||||
|
||||
private:
|
||||
void updateList();
|
||||
|
||||
void handleRemove();
|
||||
void onFilterEdit(const std::string& search_string);
|
||||
void onDoubleClick();
|
||||
|
||||
bool mInitialized;
|
||||
|
||||
std::string mFilterSubString;
|
||||
std::string mFilterSubStringOrig;
|
||||
|
||||
boost::signals2::connection mProtectedCategoriesChangedCallbackConnection;
|
||||
|
||||
LLScrollListCtrl* mFolderList;
|
||||
LLButton* mRemoveFolderBtn;
|
||||
LLFilterEditor* mFilterEditor;
|
||||
};
|
||||
|
||||
#endif // FS_FLOATERPROTECTEDFOLDERS_H
|
||||
|
|
@ -189,6 +189,7 @@
|
|||
#include "fsfloaterplacedetails.h"
|
||||
#include "fsfloaterposestand.h"
|
||||
#include "fsfloaterprofile.h"
|
||||
#include "fsfloaterprotectedfolders.h"
|
||||
#include "fsfloaterradar.h"
|
||||
#include "fsfloatersearch.h"
|
||||
#include "fsfloaterstatistics.h"
|
||||
|
|
@ -467,6 +468,7 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
LLFloaterReg::add("fs_import", "floater_fs_import.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterImport>);
|
||||
LLFloaterReg::add("fs_posestand", "floater_fs_posestand.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterPoseStand>);
|
||||
LLFloaterReg::add("fs_placedetails", "floater_fs_placedetails.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterPlaceDetails>);
|
||||
LLFloaterReg::add("fs_protectedfolders", "floater_fs_protectedfolders.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterProtectedFolders>);
|
||||
LLFloaterReg::add("fs_radar", "floater_fs_radar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterRadar>);
|
||||
LLFloaterReg::add("fs_teleporthistory", "floater_fs_teleporthistory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterTeleportHistory>);
|
||||
LLFloaterReg::add("fs_voice_controls", "floater_fs_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterVoiceControls>);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_fs_protected_folders" title="Geschützte Ordner">
|
||||
<floater.string name="UnknownFolder">
|
||||
(Unbekannter Ordner)
|
||||
</floater.string>
|
||||
<panel name="buttons_panel">
|
||||
<filter_editor label="Geschützte Ordner filtern" name="filter_input"/>
|
||||
<button name="remove_btn" tool_tip="Ordner von der Liste der geschützten Ordner entfernen"/>
|
||||
</panel>
|
||||
<panel name="panel_fs_protected_folders">
|
||||
<scroll_list name="folder_list">
|
||||
<scroll_list.columns label="Name" name="name"/>
|
||||
</scroll_list>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
@ -224,6 +224,7 @@
|
|||
<menu_item_call label="Mehrfach-Upload..." name="Bulk Upload"/>
|
||||
<menu_item_call label="Linkset importieren..." name="import linkset"/>
|
||||
</menu>
|
||||
<menu_item_check label="Geschützte Ordner" name="Protected Folders">
|
||||
<menu_item_call label="Rückgängig" name="Undo"/>
|
||||
<menu_item_call label="Wiederholen" name="Redo"/>
|
||||
<menu_item_call label="Lokaler Bitmap-Browser" name="Local Bitmap Browser"/>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater
|
||||
positioning="cascading"
|
||||
can_close="true"
|
||||
can_resize="true"
|
||||
height="350"
|
||||
help_topic="fs_protected_folders"
|
||||
min_height="150"
|
||||
min_width="175"
|
||||
layout="topleft"
|
||||
name="floater_fs_protected_folders"
|
||||
save_rect="true"
|
||||
save_visibility="true"
|
||||
single_instance="true"
|
||||
reuse_instance="true"
|
||||
title="Protected Folders"
|
||||
width="310">
|
||||
<floater.string name="UnknownFolder">
|
||||
(Unknown Folder)
|
||||
</floater.string>
|
||||
<panel
|
||||
follows="left|top|right"
|
||||
height="27"
|
||||
layout="topleft"
|
||||
left="2"
|
||||
name="buttons_panel"
|
||||
right="-1"
|
||||
top="2">
|
||||
<filter_editor
|
||||
follows="left|top|right"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
label="Filter Protected Folders"
|
||||
max_length_chars="300"
|
||||
name="filter_input"
|
||||
top="1"
|
||||
right="-35" />
|
||||
<button
|
||||
follows="right"
|
||||
height="25"
|
||||
image_hover_unselected="Toolbar_Middle_Over"
|
||||
image_overlay="TrashItem_Off"
|
||||
image_selected="Toolbar_Middle_Selected"
|
||||
image_unselected="Toolbar_Middle_Off"
|
||||
left_pad="2"
|
||||
layout="topleft"
|
||||
name="remove_btn"
|
||||
tool_tip="Remove folder from protected folder list"
|
||||
top_delta="0"
|
||||
width="31"/>
|
||||
</panel>
|
||||
|
||||
<panel
|
||||
layout="topleft"
|
||||
follows="all"
|
||||
name="panel_fs_protected_folders"
|
||||
top="32"
|
||||
left="2"
|
||||
bottom="-2"
|
||||
right="-1">
|
||||
<scroll_list
|
||||
draw_heading="true"
|
||||
follows="all"
|
||||
layout="topleft"
|
||||
top="0"
|
||||
left="0"
|
||||
bottom="-1"
|
||||
right="-1"
|
||||
sort_column="0"
|
||||
sort_ascending="true"
|
||||
name="folder_list"
|
||||
draw_stripes="true"
|
||||
multi_select="true">
|
||||
<scroll_list.columns
|
||||
label="Name"
|
||||
name="name"
|
||||
dynamic_width="true"/>
|
||||
</scroll_list>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
@ -1907,6 +1907,17 @@
|
|||
</menu_item_call>
|
||||
</menu>
|
||||
<menu_item_separator/>
|
||||
<menu_item_check
|
||||
label="Protected Folders"
|
||||
name="Protected Folders">
|
||||
<menu_item_check.on_check
|
||||
function="Floater.Visible"
|
||||
parameter="fs_protectedfolders" />
|
||||
<menu_item_check.on_click
|
||||
function="Floater.Toggle"
|
||||
parameter="fs_protectedfolders" />
|
||||
</menu_item_check>
|
||||
<menu_item_separator/>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Undo"
|
||||
|
|
|
|||
Loading…
Reference in New Issue