is dirty code in day cycle editor. When environment panel closes disconnect commit hook for crash.
parent
185915aeed
commit
06a77dd5fe
|
|
@ -137,7 +137,8 @@ LLFloaterEditExtDayCycle::LLFloaterEditExtDayCycle(const LLSD &key) :
|
|||
mWaterBlender(),
|
||||
mScratchSky(),
|
||||
mScratchWater(),
|
||||
mIsPlaying(false)
|
||||
mIsPlaying(false),
|
||||
mIsDirty(false)
|
||||
{
|
||||
|
||||
mCommitCallbackRegistrar.add(EVNT_DAYTRACK, [this](LLUICtrl *ctrl, const LLSD &data) { onTrackSelectionCallback(data); });
|
||||
|
|
@ -175,7 +176,7 @@ BOOL LLFloaterEditExtDayCycle::postBuild()
|
|||
mFlyoutControl = new LLFlyoutComboBtnCtrl(this, BTN_SAVE, BTN_FLYOUT, XML_FLYOUTMENU_FILE);
|
||||
mFlyoutControl->setAction([this](LLUICtrl *ctrl, const LLSD &data) { onButtonApply(ctrl, data); });
|
||||
|
||||
getChild<LLButton>(BTN_CANCEL, true)->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onBtnCancel(); });
|
||||
getChild<LLButton>(BTN_CANCEL, true)->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onClickCloseBtn(); });
|
||||
mTimeSlider->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onTimeSliderMoved(); });
|
||||
mAddFrameButton->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onAddTrack(); });
|
||||
mDeleteFrameButton->setCommitCallback([this](LLUICtrl *ctrl, const LLSD &data) { onRemoveTrack(); });
|
||||
|
|
@ -189,6 +190,26 @@ BOOL LLFloaterEditExtDayCycle::postBuild()
|
|||
|
||||
mTimeSlider->addSlider(0);
|
||||
|
||||
LLTabContainer* tab_container = mSkyTabLayoutContainer->getChild<LLTabContainer>("sky_tabs");
|
||||
S32 tab_count = tab_container->getTabCount();
|
||||
|
||||
for (S32 idx = 0; idx < tab_count; ++idx)
|
||||
{
|
||||
LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
|
||||
if (panel)
|
||||
panel->setOnDirtyFlagChanged([this](LLPanel *, bool val) { onPanelDirtyFlagChanged(val); });
|
||||
}
|
||||
|
||||
tab_container = mWaterTabLayoutContainer->getChild<LLTabContainer>("water_tabs");
|
||||
tab_count = tab_container->getTabCount();
|
||||
|
||||
for (S32 idx = 0; idx < tab_count; ++idx)
|
||||
{
|
||||
LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
|
||||
if (panel)
|
||||
panel->setOnDirtyFlagChanged([this](LLPanel *, bool val) { onPanelDirtyFlagChanged(val); });
|
||||
}
|
||||
|
||||
//getChild<LLButton>("sky1_track", true)->setToggleState(true);
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -312,12 +333,12 @@ void LLFloaterEditExtDayCycle::onClose(bool app_quitting)
|
|||
doCloseInventoryFloater(app_quitting);
|
||||
// there's no point to change environment if we're quitting
|
||||
// or if we already restored environment
|
||||
if (!app_quitting && LLEnvironment::instance().getSelectedEnvironment() == LLEnvironment::ENV_EDIT)
|
||||
stopPlay();
|
||||
if (!app_quitting)
|
||||
{
|
||||
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
|
||||
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::TRANSITION_FAST);
|
||||
LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT);
|
||||
}
|
||||
stopPlay();
|
||||
}
|
||||
|
||||
void LLFloaterEditExtDayCycle::onFocusReceived()
|
||||
|
|
@ -355,7 +376,7 @@ void LLFloaterEditExtDayCycle::refresh()
|
|||
mFlyoutControl->setMenuItemVisible(ACTION_APPLY_PARCEL, show_apply);
|
||||
mFlyoutControl->setMenuItemVisible(ACTION_APPLY_REGION, show_apply);
|
||||
|
||||
mFlyoutControl->setMenuItemEnabled(ACTION_COMMIT, show_commit);
|
||||
mFlyoutControl->setMenuItemEnabled(ACTION_COMMIT, show_commit && !mCommitSignal.empty());
|
||||
mFlyoutControl->setMenuItemEnabled(ACTION_SAVE, is_inventory_avail);
|
||||
mFlyoutControl->setMenuItemEnabled(ACTION_SAVEAS, is_inventory_avail);
|
||||
mFlyoutControl->setMenuItemEnabled(ACTION_APPLY_LOCAL, true);
|
||||
|
|
@ -445,14 +466,18 @@ void LLFloaterEditExtDayCycle::onButtonApply(LLUICtrl *ctrl, const LLSD &data)
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloaterEditExtDayCycle::onBtnCancel()
|
||||
|
||||
void LLFloaterEditExtDayCycle::onClickCloseBtn(bool app_quitting /*= false*/)
|
||||
{
|
||||
closeFloater(); // will restore env
|
||||
if (!app_quitting)
|
||||
checkAndConfirmSettingsLoss([this](){ closeFloater(); });
|
||||
else
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLFloaterEditExtDayCycle::onButtonImport()
|
||||
{
|
||||
doImportFromDisk();
|
||||
checkAndConfirmSettingsLoss([this]() { doImportFromDisk(); });
|
||||
}
|
||||
|
||||
void LLFloaterEditExtDayCycle::onButtonLoadFrame()
|
||||
|
|
@ -657,6 +682,35 @@ void LLFloaterEditExtDayCycle::onFrameSliderMouseUp(S32 x, S32 y, MASK mask)
|
|||
selectFrame(sliderpos, LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
|
||||
}
|
||||
|
||||
|
||||
void LLFloaterEditExtDayCycle::onPanelDirtyFlagChanged(bool value)
|
||||
{
|
||||
if (value)
|
||||
setDirtyFlag();
|
||||
}
|
||||
|
||||
void LLFloaterEditExtDayCycle::checkAndConfirmSettingsLoss(on_confirm_fn cb)
|
||||
{
|
||||
if (isDirty())
|
||||
{
|
||||
LLSD args(LLSDMap("TYPE", mEditDay->getSettingsType())
|
||||
("NAME", mEditDay->getName()));
|
||||
|
||||
// create and show confirmation textbox
|
||||
LLNotificationsUtil::add("SettingsConfirmLoss", args, LLSD(),
|
||||
[this, cb](const LLSD¬if, const LLSD&resp)
|
||||
{
|
||||
S32 opt = LLNotificationsUtil::getSelectedOption(notif, resp);
|
||||
if (opt == 0)
|
||||
cb();
|
||||
});
|
||||
}
|
||||
else if (cb)
|
||||
{
|
||||
cb();
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterEditExtDayCycle::onTimeSliderMoved()
|
||||
{
|
||||
selectFrame(mTimeSlider->getCurSliderValue(), LLSettingsDay::DEFAULT_FRAME_SLOP_FACTOR);
|
||||
|
|
@ -1165,6 +1219,7 @@ void LLFloaterEditExtDayCycle::onInventoryCreated(LLUUID asset_id, LLUUID invent
|
|||
return;
|
||||
}
|
||||
|
||||
clearDirtyFlag();
|
||||
setFocus(TRUE); // Call back the focus...
|
||||
loadInventoryItem(inventory_id);
|
||||
}
|
||||
|
|
@ -1173,6 +1228,7 @@ void LLFloaterEditExtDayCycle::onInventoryUpdated(LLUUID asset_id, LLUUID invent
|
|||
{
|
||||
LL_WARNS("ENVDAYEDIT") << "Inventory item " << inventory_id << " has been updated with asset " << asset_id << " results are:" << results << LL_ENDL;
|
||||
|
||||
clearDirtyFlag();
|
||||
if (inventory_id != mInventoryId)
|
||||
{
|
||||
loadInventoryItem(inventory_id);
|
||||
|
|
@ -1198,6 +1254,7 @@ void LLFloaterEditExtDayCycle::doImportFromDisk()
|
|||
}
|
||||
|
||||
mCurrentTrack = 1;
|
||||
setDirtyFlag();
|
||||
setEditDayCycle(legacyday);
|
||||
}
|
||||
}
|
||||
|
|
@ -1274,6 +1331,33 @@ void LLFloaterEditExtDayCycle::onIdlePlay(void* user_data)
|
|||
|
||||
}
|
||||
|
||||
|
||||
void LLFloaterEditExtDayCycle::clearDirtyFlag()
|
||||
{
|
||||
mIsDirty = false;
|
||||
|
||||
LLTabContainer* tab_container = mSkyTabLayoutContainer->getChild<LLTabContainer>("sky_tabs");
|
||||
S32 tab_count = tab_container->getTabCount();
|
||||
|
||||
for (S32 idx = 0; idx < tab_count; ++idx)
|
||||
{
|
||||
LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
|
||||
if (panel)
|
||||
panel->clearIsDirty();
|
||||
}
|
||||
|
||||
tab_container = mWaterTabLayoutContainer->getChild<LLTabContainer>("water_tabs");
|
||||
tab_count = tab_container->getTabCount();
|
||||
|
||||
for (S32 idx = 0; idx < tab_count; ++idx)
|
||||
{
|
||||
LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
|
||||
if (panel)
|
||||
panel->clearIsDirty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e type, LLUUID currasset)
|
||||
{
|
||||
// LLUI::sWindow->setCursor(UI_CURSOR_WAIT);
|
||||
|
|
|
|||
|
|
@ -91,13 +91,15 @@ public:
|
|||
|
||||
BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent) override;
|
||||
|
||||
private:
|
||||
BOOL isDirty() const override { return getIsDirty(); }
|
||||
|
||||
private:
|
||||
typedef std::function<void()> on_confirm_fn;
|
||||
F32 getCurrentFrame() const;
|
||||
|
||||
// flyout response/click
|
||||
void onButtonApply(LLUICtrl *ctrl, const LLSD &data);
|
||||
void onBtnCancel();
|
||||
virtual void onClickCloseBtn(bool app_quitting = false) override;
|
||||
void onButtonImport();
|
||||
void onButtonLoadFrame();
|
||||
void onAddTrack();
|
||||
|
|
@ -113,6 +115,10 @@ private:
|
|||
void onFrameSliderMouseDown(S32 x, S32 y, MASK mask);
|
||||
void onFrameSliderMouseUp(S32 x, S32 y, MASK mask);
|
||||
|
||||
void onPanelDirtyFlagChanged(bool);
|
||||
|
||||
void checkAndConfirmSettingsLoss(on_confirm_fn cb);
|
||||
|
||||
void selectTrack(U32 track_index, bool force = false);
|
||||
void selectFrame(F32 frame, F32 slop_factor);
|
||||
void clearTabs();
|
||||
|
|
@ -158,6 +164,10 @@ private:
|
|||
void stopPlay();
|
||||
static void onIdlePlay(void *);
|
||||
|
||||
bool getIsDirty() const { return mIsDirty; }
|
||||
void setDirtyFlag() { mIsDirty = true; }
|
||||
virtual void clearDirtyFlag();
|
||||
|
||||
LLSettingsDay::ptr_t mEditDay; // edited copy
|
||||
LLSettingsDay::Seconds mDayLength;
|
||||
U32 mCurrentTrack;
|
||||
|
|
@ -190,6 +200,7 @@ private:
|
|||
LLFrameTimer mPlayTimer;
|
||||
F32 mPlayStartFrame; // an env frame
|
||||
bool mIsPlaying;
|
||||
bool mIsDirty;
|
||||
|
||||
edit_commit_signal_t mCommitSignal;
|
||||
|
||||
|
|
|
|||
|
|
@ -273,7 +273,6 @@ void LLFloaterFixedEnvironment::checkAndConfirmSettingsLoss(LLFloaterFixedEnviro
|
|||
{
|
||||
cb();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLFloaterFixedEnvironment::onPickerCommitSetting(LLUUID asset_id)
|
||||
|
|
|
|||
|
|
@ -119,7 +119,19 @@ void LLPanelEnvironmentInfo::onVisibilityChange(BOOL new_visibility)
|
|||
if (new_visibility)
|
||||
gIdleCallbacks.addFunction(onIdlePlay, this);
|
||||
else
|
||||
{
|
||||
gIdleCallbacks.deleteFunction(onIdlePlay, this);
|
||||
LLFloaterEditExtDayCycle *dayeditor = getEditFloater();
|
||||
if (mCommitConnection.connected())
|
||||
mCommitConnection.disconnect();
|
||||
if (dayeditor)
|
||||
{
|
||||
if (dayeditor->isDirty())
|
||||
dayeditor->refresh();
|
||||
else
|
||||
dayeditor->closeFloater();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -213,13 +225,13 @@ LLFloaterSettingsPicker *LLPanelEnvironmentInfo::getSettingsPicker()
|
|||
return picker;
|
||||
}
|
||||
|
||||
LLFloaterEditExtDayCycle * LLPanelEnvironmentInfo::getEditFloater()
|
||||
LLFloaterEditExtDayCycle * LLPanelEnvironmentInfo::getEditFloater(bool create)
|
||||
{
|
||||
static const S32 FOURHOURS(4 * 60 * 60);
|
||||
LLFloaterEditExtDayCycle *editor = static_cast<LLFloaterEditExtDayCycle *>(mEditFloater.get());
|
||||
|
||||
// Show the dialog
|
||||
if (!editor)
|
||||
if (!editor && create)
|
||||
{
|
||||
LLSD params(LLSDMap(LLFloaterEditExtDayCycle::KEY_EDIT_CONTEXT, (mCurrentParcelId == INVALID_PARCEL_ID) ? LLFloaterEditExtDayCycle::CONTEXT_REGION : LLFloaterEditExtDayCycle::CONTEXT_PARCEL)
|
||||
(LLFloaterEditExtDayCycle::KEY_DAY_LENGTH, mCurrentEnvironment ? (S32)(mCurrentEnvironment->mDayLength.value()) : FOURHOURS));
|
||||
|
|
@ -228,9 +240,11 @@ LLFloaterEditExtDayCycle * LLPanelEnvironmentInfo::getEditFloater()
|
|||
|
||||
if (!editor)
|
||||
return nullptr;
|
||||
editor->setEditCommitSignal([this](LLSettingsDay::ptr_t pday) { onEditCommited(pday); });
|
||||
}
|
||||
|
||||
if (editor && !mCommitConnection.connected())
|
||||
mCommitConnection = editor->setEditCommitSignal([this](LLSettingsDay::ptr_t pday) { onEditCommited(pday); });
|
||||
|
||||
return editor;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -120,15 +120,19 @@ protected:
|
|||
std::string getInventoryNameForAssetId(LLUUID asset_id);
|
||||
|
||||
LLFloaterSettingsPicker * getSettingsPicker();
|
||||
LLFloaterEditExtDayCycle * getEditFloater();
|
||||
LLFloaterEditExtDayCycle * getEditFloater(bool create = true);
|
||||
|
||||
LLEnvironment::EnvironmentInfo::ptr_t mCurrentEnvironment;
|
||||
S32 mCurrentParcelId;
|
||||
|
||||
|
||||
|
||||
private:
|
||||
static void onIdlePlay(void *);
|
||||
|
||||
typedef boost::signals2::connection connection_t;
|
||||
|
||||
connection_t mCommitConnection;
|
||||
LLHandle<LLFloater> mSettingsFloater;
|
||||
LLHandle<LLFloater> mEditFloater;
|
||||
S32 mDirtyFlag;
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ void LLGridManager::initialize(const std::string& grid_file)
|
|||
addSystemGrid(LLTrans::getString("AditiGridLabel"),
|
||||
"util.aditi.lindenlab.com",
|
||||
"https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
|
||||
"https://aditi-secondlife.webdev.lindenlab.com/helpers/",
|
||||
"https://secondlife.aditi.lindenlab.com/helpers/",
|
||||
DEFAULT_LOGIN_PAGE,
|
||||
SL_UPDATE_QUERY_URL,
|
||||
"https://my.aditi.lindenlab.com/",
|
||||
|
|
|
|||
|
|
@ -258,7 +258,7 @@ namespace tut
|
|||
std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
|
||||
ensure_equals("Aditi helper uri",
|
||||
LLGridManager::getInstance()->getHelperURI("util.aditi.lindenlab.com"),
|
||||
std::string("https://aditi-secondlife.webdev.lindenlab.com/helpers/"));
|
||||
std::string("https://secondlife.aditi.lindenlab.com/helpers/"));
|
||||
ensure_equals("Aditi login page",
|
||||
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
|
||||
std::string("https://viewer-splash.secondlife.com/"));
|
||||
|
|
@ -330,7 +330,7 @@ namespace tut
|
|||
std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
|
||||
ensure_equals("Aditi helper uri",
|
||||
LLGridManager::getInstance()->getHelperURI("util.aditi.lindenlab.com"),
|
||||
std::string("https://aditi-secondlife.webdev.lindenlab.com/helpers/"));
|
||||
std::string("https://secondlife.aditi.lindenlab.com/helpers/"));
|
||||
ensure_equals("Aditi login page",
|
||||
LLGridManager::getInstance()->getLoginPage("util.aditi.lindenlab.com"),
|
||||
std::string("https://viewer-splash.secondlife.com/"));
|
||||
|
|
|
|||
Loading…
Reference in New Issue