diff options
-rw-r--r-- | indra/newview/llfloatereditextdaycycle.cpp | 120 | ||||
-rw-r--r-- | indra/newview/llfloatereditextdaycycle.h | 12 | ||||
-rw-r--r-- | indra/newview/llfloaterfixedenvironment.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llsettingspicker.cpp | 34 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_settings_picker.xml | 46 |
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" |