FIRE-20414 / FIRE-29342: Add management floater for protect folders

master
Ansariel 2020-04-14 18:57:56 +02:00
parent 22ac7edd6e
commit e989f521de
8 changed files with 370 additions and 0 deletions

View File

@ -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

View File

@ -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);
}
}

View File

@ -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

View File

@ -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>);

View File

@ -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>

View File

@ -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"/>

View File

@ -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>

View File

@ -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"