summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandreykproductengine <andreykproductengine@lindenlab.com>2019-01-22 22:01:00 +0200
committerandreykproductengine <andreykproductengine@lindenlab.com>2019-01-22 22:01:00 +0200
commitd693c5350933e664e5131c98babc7fbb2b4571aa (patch)
tree4705289b336823901052c149e0e6dd1f94d03b4b
parenta5392bb8e822b3f75559275b3ccef7d4c55b0f9d (diff)
SL-1932 Day Cycle Edit feature "Load Track" Part 1
-rw-r--r--indra/newview/llfloatereditextdaycycle.cpp120
-rw-r--r--indra/newview/llfloatereditextdaycycle.h12
-rw-r--r--indra/newview/llfloaterfixedenvironment.cpp2
-rw-r--r--indra/newview/llsettingspicker.cpp34
-rw-r--r--indra/newview/skins/default/xui/en/floater_settings_picker.xml46
5 files changed, 173 insertions, 41 deletions
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 9583f9f792..601b964410 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -287,8 +287,6 @@ BOOL LLFloaterEditExtDayCycle::postBuild()
panel->setOnDirtyFlagChanged([this](LLPanel *, bool val) { onPanelDirtyFlagChanged(val); });
}
- //getChild<LLButton>("sky1_track", true)->setToggleState(true);
-
return TRUE;
}
@@ -751,7 +749,7 @@ void LLFloaterEditExtDayCycle::onButtonLoadFrame()
{
curitemId = LLFloaterSettingsPicker::findItemID(mCurrentEdit->getAssetId(), false, false);
}
-
+
doOpenInventoryFloater((mCurrentTrack == LLSettingsDay::TRACK_WATER) ? LLSettingsType::ST_WATER : LLSettingsType::ST_SKY, curitemId);
}
@@ -810,7 +808,14 @@ void LLFloaterEditExtDayCycle::onCloneTrack()
void LLFloaterEditExtDayCycle::onLoadTrack()
{
+ LLUUID curitemId = mInventoryId;
+
+ if (mCurrentEdit && curitemId.notNull())
+ {
+ curitemId = LLFloaterSettingsPicker::findItemID(mCurrentEdit->getAssetId(), false, false);
+ }
+ doOpenInventoryFloater(LLSettingsType::ST_DAYCYCLE, curitemId);
}
@@ -1021,6 +1026,34 @@ void LLFloaterEditExtDayCycle::onTimeSliderCallback()
selectFrame(mTimeSlider->getCurSliderValue(), LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
}
+void LLFloaterEditExtDayCycle::cloneTrack(U32 source_index, U32 dest_index)
+{
+ cloneTrack(mEditDay, source_index, dest_index);
+}
+
+void LLFloaterEditExtDayCycle::cloneTrack(const LLSettingsDay::ptr_t &source_day, U32 source_index, U32 dest_index)
+{
+ if (source_index == LLSettingsDay::TRACK_WATER || dest_index == LLSettingsDay::TRACK_WATER)
+ {
+ LL_WARNS() << "water track can't be source or destination for copying" << LL_ENDL;
+ return;
+ }
+
+ // don't use replaceCycleTrack because we will end up with references, but we need to clone
+ mEditDay->clearCycleTrack(dest_index); // because source can be empty
+ LLSettingsDay::CycleTrack_t source_track = source_day->getCycleTrack(source_index);
+
+ for (auto &track_frame : source_track)
+ {
+ LLSettingsSky::ptr_t psky = std::static_pointer_cast<LLSettingsSky>(track_frame.second);
+ mEditDay->setSettingsAtKeyframe(psky->buildDerivedClone(), track_frame.first, dest_index);
+ }
+
+ updateSlider();
+ updateTabs();
+ updateButtons();
+}
+
void LLFloaterEditExtDayCycle::selectTrack(U32 track_index, bool force )
{
if (track_index < LLSettingsDay::TRACK_MAX)
@@ -1180,8 +1213,6 @@ void LLFloaterEditExtDayCycle::updateButtons()
bool can_load(true);
bool can_clear(true);
- can_clear = (mCurrentTrack > 1) ? (!mEditDay->getCycleTrack(mCurrentTrack).empty()) : (mEditDay->getCycleTrack(mCurrentTrack).size() > 1);
-
if (mCurrentTrack == 0)
{
can_clone = false;
@@ -1196,12 +1227,20 @@ void LLFloaterEditExtDayCycle::updateButtons()
}
}
+ can_clear = (mCurrentTrack > 1) ? (!mEditDay->getCycleTrack(mCurrentTrack).empty()) : (mEditDay->getCycleTrack(mCurrentTrack).size() > 1);
mCloneTrack->setEnabled(can_clone && false);
mCloneTrack->setVisible(false);
- mLoadTrack->setEnabled(can_load && false);
- mLoadTrack->setVisible(false);
+ mLoadTrack->setEnabled(can_load);
mClearTrack->setEnabled(can_clear);
+ // update track buttons
+ bool extended_env = LLEnvironment::instance().isExtendedEnvironmentEnabled();
+ for (S32 track = 0; track < LLSettingsDay::TRACK_MAX; ++track)
+ {
+ LLButton* button = getChild<LLButton>(track_tabs[track], true);
+ button->setEnabled(extended_env);
+ button->setToggleState(track == mCurrentTrack);
+ }
}
void LLFloaterEditExtDayCycle::updateSlider()
@@ -1788,7 +1827,7 @@ void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e typ
mInventoryFloater = picker->getHandle();
- picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitSetting(data.asUUID()); });
+ picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitSetting(data["ItemId"].asUUID(), data["Track"].asInteger()); });
}
picker->setSettingsFilter(type);
@@ -1807,25 +1846,39 @@ void LLFloaterEditExtDayCycle::doCloseInventoryFloater(bool quitting)
}
}
-void LLFloaterEditExtDayCycle::onPickerCommitSetting(LLUUID item_id)
+void LLFloaterEditExtDayCycle::onPickerCommitSetting(LLUUID item_id, S32 track)
{
LLSettingsBase::TrackPosition frame(mTimeSlider->getCurSliderValue());
- S32 track = mCurrentTrack;
LLViewerInventoryItem *itemp = gInventory.getItem(item_id);
if (itemp)
{
LLSettingsVOBase::getSettingsAsset(itemp->getAssetUUID(),
- [this, track, frame, item_id](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onAssetLoadedForFrame(item_id, asset_id, settings, status, track, frame); });
+ [this, track, frame, item_id](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onAssetLoadedForInsertion(item_id, asset_id, settings, status, track, mCurrentTrack, frame); });
}
}
-void LLFloaterEditExtDayCycle::onAssetLoadedForFrame(LLUUID item_id, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 track, LLSettingsBase::TrackPosition frame)
+void LLFloaterEditExtDayCycle::onAssetLoadedForInsertion(LLUUID item_id, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 source_track, S32 dest_track, LLSettingsBase::TrackPosition frame)
{
- std::function<void()> cb = [this, settings, frame, track]()
+ std::function<void()> cb = [this, settings, frame, source_track, dest_track]()
{
- if (mFramesSlider->getCurSlider().empty())
+ if (settings->getSettingsType() == "daycycle")
+ {
+ // Load full track
+ LLSettingsDay::ptr_t pday = std::dynamic_pointer_cast<LLSettingsDay>(settings);
+ if (dest_track == LLSettingsDay::TRACK_WATER)
+ {
+ cloneTrack(pday, LLSettingsDay::TRACK_WATER, LLSettingsDay::TRACK_WATER);
+ }
+ else
+ {
+ cloneTrack(pday, source_track, dest_track);
+ }
+ }
+ else
{
- if ((mEditDay->getSettingsNearKeyframe(frame, mCurrentTrack, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)).second)
+ // load single frame
+
+ if ((mEditDay->getSettingsNearKeyframe(frame, dest_track, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR)).second)
{
LL_WARNS("ENVDAYEDIT") << "Attempt to add new frame too close to existing frame." << LL_ENDL;
return;
@@ -1835,23 +1888,36 @@ void LLFloaterEditExtDayCycle::onAssetLoadedForFrame(LLUUID item_id, LLUUID asse
LL_WARNS("ENVDAYEDIT") << "Attempt to add new frame when slider is full." << LL_ENDL;
return;
}
- mEditDay->setSettingsAtKeyframe(settings, frame, track);
- addSliderFrame(frame, settings, false);
- reblendSettings();
- synchronizeTabs();
- }
- else
- {
- if (mCurrentTrack == LLSettingsDay::TRACK_WATER)
+ // Don't forget to clone (we might reuse/load it couple times)
+ if (settings->getSettingsType() == "sky")
{
- mEditDay->setWaterAtKeyframe(std::static_pointer_cast<LLSettingsWater>(settings), frame);
+ // Load sky to frame
+ if (dest_track != LLSettingsDay::TRACK_WATER)
+ {
+ mEditDay->setSettingsAtKeyframe(settings->buildDerivedClone(), frame, dest_track);
+ addSliderFrame(frame, settings, false);
+ }
+ else
+ {
+ LL_WARNS("ENVDAYEDIT") << "Trying to load day settings as sky" << LL_ENDL;
+ }
}
- else
+ else if (settings->getSettingsType() == "water")
{
- mEditDay->setSkyAtKeyframe(std::static_pointer_cast<LLSettingsSky>(settings), frame, track);
+ // Load water to frame
+ if (dest_track == LLSettingsDay::TRACK_WATER)
+ {
+ mEditDay->setSettingsAtKeyframe(settings->buildDerivedClone(), frame, dest_track);
+ addSliderFrame(frame, settings, false);
+ }
+ else
+ {
+ LL_WARNS("ENVDAYEDIT") << "Trying to load water settings as sky" << LL_ENDL;
+ }
}
- updateTabs();
}
+ reblendSettings();
+ synchronizeTabs();
};
if (!settings || status)
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index 67a6f1e0e9..e808ab8a46 100644
--- a/indra/newview/llfloatereditextdaycycle.h
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -132,6 +132,8 @@ private:
void checkAndConfirmSettingsLoss(on_confirm_fn cb);
+ void cloneTrack(U32 source_index, U32 dest_index);
+ void cloneTrack(const LLSettingsDay::ptr_t &source_day, U32 source_index, U32 dest_index);
void selectTrack(U32 track_index, bool force = false);
void selectFrame(F32 frame, F32 slop_factor);
void clearTabs();
@@ -160,8 +162,14 @@ private:
void doOpenInventoryFloater(LLSettingsType::type_e type, LLUUID curritem);
void doCloseInventoryFloater(bool quitting = false);
- void onPickerCommitSetting(LLUUID item_id);
- void onAssetLoadedForFrame(LLUUID item_id, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 track, LLSettingsBase::TrackPosition frame);
+ void onPickerCommitSetting(LLUUID item_id, S32 track);
+ void onAssetLoadedForInsertion(LLUUID item_id,
+ LLUUID asset_id,
+ LLSettingsBase::ptr_t settings,
+ S32 status,
+ S32 source_track,
+ S32 dest_track,
+ LLSettingsBase::TrackPosition dest_frame);
bool canUseInventory() const;
bool canApplyRegion() const;
diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index 4e6bc6eae0..98cec04898 100644
--- a/indra/newview/llfloaterfixedenvironment.cpp
+++ b/indra/newview/llfloaterfixedenvironment.cpp
@@ -243,7 +243,7 @@ LLFloaterSettingsPicker * LLFloaterFixedEnvironment::getSettingsPicker()
mInventoryFloater = picker->getHandle();
- picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitSetting(data.asUUID()); });
+ picker->setCommitCallback([this](LLUICtrl *, const LLSD &data){ onPickerCommitSetting(data["ItemId"].asUUID() /*data["Track"]*/); });
}
return picker;
diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp
index d115f6fa4f..d2824e04a9 100644
--- a/indra/newview/llsettingspicker.cpp
+++ b/indra/newview/llsettingspicker.cpp
@@ -28,6 +28,7 @@
#include "llsettingspicker.h"
+#include "llcombobox.h"
#include "llfiltereditor.h"
#include "llfolderviewmodel.h"
#include "llinventory.h"
@@ -47,7 +48,9 @@ namespace
const std::string FLOATER_DEFINITION_XML("floater_settings_picker.xml");
const std::string FLT_INVENTORY_SEARCH("flt_inventory_search");
+ const std::string CMB_TRACK_SELECTION("track_selection");
const std::string PNL_INVENTORY("pnl_inventory");
+ const std::string PNL_COMBO("pnl_combo");
const std::string BTN_SELECT("btn_select");
const std::string BTN_CANCEL("btn_cancel");
@@ -162,6 +165,8 @@ void LLFloaterSettingsPicker::setSettingsFilter(LLSettingsType::type_e type)
filter = static_cast<S64>(0x1) << static_cast<S64>(type);
}
+ getChild<LLPanel>(PNL_COMBO)->setVisible(type != LLSettingsType::ST_WATER && type != LLSettingsType::ST_SKY);
+
mInventoryPanel->setFilterSettingsTypes(filter);
}
@@ -263,6 +268,7 @@ void LLFloaterSettingsPicker::onFilterEdit(const std::string& search_string)
void LLFloaterSettingsPicker::onSelectionChange(const LLFloaterSettingsPicker::itemlist_t &items, bool user_action)
{
+ bool track_picker_enabled = false;
if (items.size())
{
LLFolderViewItem* first_item = items.front();
@@ -284,9 +290,16 @@ void LLFloaterSettingsPicker::onSelectionChange(const LLFloaterSettingsPicker::i
{
mChangeIDSignal(mSettingItemID);
}
+
+ if (bridge_model->getSettingsType() == LLSettingsType::ST_DAYCYCLE
+ && !mNoCopySettingsSelected)
+ {
+ track_picker_enabled = true;
+ }
}
}
}
+ getChild<LLView>(CMB_TRACK_SELECTION)->setEnabled(track_picker_enabled);
}
void LLFloaterSettingsPicker::onButtonCancel()
@@ -297,7 +310,12 @@ void LLFloaterSettingsPicker::onButtonCancel()
void LLFloaterSettingsPicker::onButtonSelect()
{
if (mCommitSignal)
- (*mCommitSignal)(this, LLSD(mSettingItemID));
+ {
+ LLSD res;
+ res["ItemId"] = mSettingItemID;
+ res["Track"] = getChild<LLComboBox>(CMB_TRACK_SELECTION)->getValue();
+ (*mCommitSignal)(this, res);
+ }
closeFloater();
}
@@ -321,7 +339,12 @@ BOOL LLFloaterSettingsPicker::handleDoubleClick(S32 x, S32 y, MASK mask)
{
// Quick-apply
if (mCommitSignal)
- (*mCommitSignal)(this, LLSD(mSettingItemID));
+ {
+ LLSD res;
+ res["ItemId"] = mSettingItemID;
+ res["Track"] = getChild<LLComboBox>(CMB_TRACK_SELECTION)->getValue();
+ (*mCommitSignal)(this, res);
+ }
closeFloater();
}
}
@@ -346,7 +369,12 @@ BOOL LLFloaterSettingsPicker::handleKeyHere(KEY key, MASK mask)
{
// Quick-apply
if (mCommitSignal)
- (*mCommitSignal)(this, LLSD(mSettingItemID));
+ {
+ LLSD res;
+ res["ItemId"] = mSettingItemID;
+ res["Track"] = getChild<LLComboBox>(CMB_TRACK_SELECTION)->getValue();
+ (*mCommitSignal)(this, res);
+ }
closeFloater();
return TRUE;
}
diff --git a/indra/newview/skins/default/xui/en/floater_settings_picker.xml b/indra/newview/skins/default/xui/en/floater_settings_picker.xml
index 7cc2c517ca..9ea949088f 100644
--- a/indra/newview/skins/default/xui/en/floater_settings_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_settings_picker.xml
@@ -14,10 +14,6 @@
<!-- top static -->
<floater.string
- name="choose_picture">
- Click to choose a picture
- </floater.string>
- <floater.string
name="pick title">
Pick:
</floater.string>
@@ -30,10 +26,10 @@
right="-6"
bottom="-10"
orientation="vertical">
- <layout_panel name="temp"
+ <layout_panel name="inv_list"
border="false"
auto_resize="true"
- user_resize="true"
+ user_resize="false"
height="29"
min_height="29"
bg_alpha_color="blue"
@@ -72,14 +68,48 @@
filter_asset_type="settings" />
</panel>
</layout_panel>
+ <layout_panel name="pnl_combo"
+ border="false"
+ auto_resize="false"
+ user_resize="false"
+ visible="true"
+ height="29"
+ bg_alpha_color="blue"
+ background_visible="false">
+ <combo_box
+ allow_text_entry="false"
+ follows="left|top"
+ height="23"
+ left="10"
+ max_chars="100"
+ mouse_opaque="true"
+ name="track_selection"
+ top="1"
+ width="190">
+ <combo_box.item
+ label="Sky4"
+ name="Sky4"
+ value="4" />
+ <combo_box.item
+ label="Sky3"
+ name="Sky3"
+ value="3" />
+ <combo_box.item
+ label="Sky2"
+ name="Sky2"
+ value="2" />
+ <combo_box.item
+ label="Ground"
+ name="Ground"
+ value="1" />
+ </combo_box>
+ </layout_panel>
<layout_panel name="temp"
border="false"
auto_resize="false"
user_resize="false"
height="29"
min_height="29">
- <!-- bg_alpha_color="red"
- background_visible="true" -->
<button
follows="top|left"
height="20"