summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/app_settings/settings.xml11
-rw-r--r--indra/newview/llfloaterregioninfo.cpp23
-rw-r--r--indra/newview/llfloaterregioninfo.h2
-rw-r--r--indra/newview/llfloaterregionrestartschedule.cpp386
-rw-r--r--indra/newview/llfloaterregionrestartschedule.h74
-rwxr-xr-xindra/newview/llviewerregion.cpp1
-rw-r--r--indra/newview/skins/default/xui/en/floater_region_restart_schedule.xml278
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml14
9 files changed, 790 insertions, 1 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index d4c2875c6c..def2d8f0c0 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -278,6 +278,7 @@ set(viewer_SOURCE_FILES
llfloaterregioninfo.cpp
llfloaterreporter.cpp
llfloaterregionrestarting.cpp
+ llfloaterregionrestartschedule.cpp
llfloatersavecamerapreset.cpp
llfloatersaveprefpreset.cpp
llfloatersceneloadstats.cpp
@@ -945,6 +946,7 @@ set(viewer_HEADER_FILES
llfloaterregioninfo.h
llfloaterreporter.h
llfloaterregionrestarting.h
+ llfloaterregionrestartschedule.h
llfloatersavecamerapreset.h
llfloatersaveprefpreset.h
llfloatersceneloadstats.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 235d294849..97cab58eb1 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -12682,6 +12682,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>Use24HourClock</key>
+ <map>
+ <key>Comment</key>
+ <string>12 vs 24. At the moment only for region restart schedule floater</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>EnvironmentPersistAcrossLogin</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index cc9aca1338..02ef342c2a 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -61,6 +61,7 @@
#include "llfloatergroups.h"
#include "llfloaterreg.h"
#include "llfloaterregiondebugconsole.h"
+#include "llfloaterregionrestartschedule.h"
#include "llfloatertelehub.h"
#include "llgltfmateriallist.h"
#include "llinventorymodel.h"
@@ -259,6 +260,7 @@ bool LLFloaterRegionInfo::postBuild()
panel = new LLPanelRegionGeneralInfo;
mInfoPanels.push_back(panel);
panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
+ panel->getCommitCallbackRegistrar().add("RegionInfo.ManageRestart", boost::bind(&LLPanelRegionInfo::onClickManageRestartSchedule, panel));
panel->buildFromFile("panel_region_general.xml");
mTab->addTabPanel(panel);
@@ -862,6 +864,25 @@ void LLPanelRegionInfo::onClickManageTelehub()
LLFloaterReg::showInstance("telehubs");
}
+void LLPanelRegionInfo::onClickManageRestartSchedule()
+{
+ LLFloater* floaterp = mFloaterRestartScheduleHandle.get();
+ // Show the dialog
+ if (!floaterp)
+ {
+ floaterp = new LLFloaterRegionRestartSchedule(this);
+ }
+
+ if (floaterp->getVisible())
+ {
+ floaterp->closeFloater();
+ }
+ else
+ {
+ floaterp->openFloater();
+ }
+}
+
/////////////////////////////////////////////////////////////////////////////
// LLPanelRegionGeneralInfo
//
@@ -877,6 +898,8 @@ bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region)
getChildView("kick_all_btn")->setEnabled(allow_modify);
getChildView("im_btn")->setEnabled(allow_modify);
getChildView("manage_telehub_btn")->setEnabled(allow_modify);
+ getChildView("manage_restart_btn")->setEnabled(allow_modify);
+ getChildView("manage_restart_btn")->setVisible(LLFloaterRegionRestartSchedule::canUse());
// Data gets filled in by processRegionInfo
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 60564435d7..b604a28fc3 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -154,6 +154,7 @@ public:
void disableButton(const std::string& btn_name);
void onClickManageTelehub();
+ void onClickManageRestartSchedule();
protected:
void initCtrl(const std::string& name);
@@ -174,6 +175,7 @@ protected:
// member data
LLHost mHost;
+ LLHandle<LLFloater> mFloaterRestartScheduleHandle;
};
/////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llfloaterregionrestartschedule.cpp b/indra/newview/llfloaterregionrestartschedule.cpp
new file mode 100644
index 0000000000..59bcb22dce
--- /dev/null
+++ b/indra/newview/llfloaterregionrestartschedule.cpp
@@ -0,0 +1,386 @@
+/**
+ * @file llfloaterregionrestartschedule.cpp
+ * @author Andrii Kleshchev
+ * @brief LLFloaterRegionRestartSchedule class
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * 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
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterregionrestartschedule.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "lllineeditor.h"
+#include "llviewercontrol.h"
+
+
+// match with values used by capability
+constexpr char CHECKBOX_PREFIXES[] =
+{
+ 's',
+ 'm',
+ 't',
+ 'w',
+ 'r',
+ 'f',
+ 'a',
+};
+
+const std::string CHECKBOX_NAME = "_chk";
+
+LLFloaterRegionRestartSchedule::LLFloaterRegionRestartSchedule(
+ LLView* owner)
+ : LLFloater(LLSD())
+ , mOwnerHandle(owner->getHandle())
+{
+ buildFromFile("floater_region_restart_schedule.xml");
+}
+
+LLFloaterRegionRestartSchedule::~LLFloaterRegionRestartSchedule()
+{
+
+}
+
+bool LLFloaterRegionRestartSchedule::postBuild()
+{
+ mPMAMButton = getChild<LLButton>("am_pm_btn");
+ mPMAMButton->setClickedCallback([this](LLUICtrl*, const LLSD&) { onPMAMButtonClicked(); });
+
+ // By default mPMAMButton is supposed to be visible.
+ // If localized xml set mPMAMButton to be invisible, assume
+ // 24h format and prealligned "UTC" label
+ if (mPMAMButton->getVisible())
+ {
+ bool use_24h_format = gSavedSettings.getBOOL("Use24HourClock");
+ if (use_24h_format)
+ {
+ mPMAMButton->setVisible(false);
+ LLUICtrl* lbl = getChild<LLUICtrl>("utc_label");
+ lbl->translate(-mPMAMButton->getRect().getWidth(), 0);
+ }
+ }
+
+ mSaveButton = getChild<LLButton>("save_btn");
+ mSaveButton->setClickedCallback([this](LLUICtrl*, const LLSD&) { onSaveButtonClicked(); });
+
+ mCancelButton = getChild<LLButton>("cancel_btn");
+ mCancelButton->setClickedCallback([this](LLUICtrl*, const LLSD&) { closeFloater(false); });
+
+
+ mHoursLineEditor = getChild<LLLineEditor>("hours_edt");
+ mHoursLineEditor->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+ mHoursLineEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& value) { onCommitHours(value); });
+
+ mMinutesLineEditor = getChild<LLLineEditor>("minutes_edt");
+ mMinutesLineEditor->setPrevalidate(LLTextValidate::validateNonNegativeS32);
+ mMinutesLineEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& value) { onCommitMinutes(value); });
+
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl* chk = getChild<LLCheckBoxCtrl>(name);
+ chk->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& value) { mSaveButton->setEnabled(true); });
+ }
+
+ resetUI(false);
+
+ return true;
+}
+
+void LLFloaterRegionRestartSchedule::onOpen(const LLSD& key)
+{
+ std::string url = gAgent.getRegionCapability("RegionSchedule");
+ if (!url.empty())
+ {
+ LLCoros::instance().launch("LLFloaterRegionRestartSchedule::requestRegionShcheduleCoro",
+ boost::bind(&LLFloaterRegionRestartSchedule::requestRegionShcheduleCoro, url, getHandle()));
+
+ mSaveButton->setEnabled(false);
+ }
+ else
+ {
+ LL_WARNS("Region") << "Started region schedule floater, but RegionSchedule capability is not available" << LL_ENDL;
+ }
+}
+
+void LLFloaterRegionRestartSchedule::draw()
+{
+ LLView* owner = mOwnerHandle.get();
+ if (owner)
+ {
+ static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+ drawConeToOwner(mContextConeOpacity, max_opacity, owner);
+ }
+
+ LLFloater::draw();
+}
+
+void LLFloaterRegionRestartSchedule::onPMAMButtonClicked()
+{
+ mSaveButton->setEnabled(true);
+ mTimeAM = !mTimeAM;
+ updateAMPM();
+}
+
+void LLFloaterRegionRestartSchedule::onSaveButtonClicked()
+{
+ std::string url = gAgent.getRegionCapability("RegionSchedule");
+ if (!url.empty())
+ {
+ std::string days;
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl* chk = getChild<LLCheckBoxCtrl>(name);
+ if (chk->getValue())
+ {
+ days += c;
+ }
+ }
+ LLSD restart;
+ if (days.size() < 7)
+ {
+ LLStringUtil::toUpper(days);
+ restart["type"] = "W";
+ // if days are empty, will reset schedule
+ restart["days"] = days;
+ }
+ else
+ {
+ restart["type"] = "D";
+ }
+ S32 hours = mHoursLineEditor->getValue().asInteger();
+ if (mPMAMButton->getVisible())
+ {
+ if (hours == 12)
+ {
+ hours = 0; // 12:00 AM equals 0:00, while 12:00 PM equals 12:00
+ }
+ if (!mTimeAM)
+ {
+ hours += 12;
+ }
+ }
+ restart["time"] = hours * 3600 + mMinutesLineEditor->getValue().asInteger() * 60;
+
+ LLSD body;
+ body["restart"] = restart; // event name, at the moment only "restart" is supported
+ LLCoros::instance().launch("LLFloaterRegionRestartSchedule::setRegionShcheduleCoro",
+ boost::bind(&LLFloaterRegionRestartSchedule::setRegionShcheduleCoro, url, body, getHandle()));
+
+ mSaveButton->setEnabled(false);
+ }
+ else
+ {
+ LL_WARNS("Region") << "Saving region schedule, but RegionSchedule capability is not available" << LL_ENDL;
+ }
+}
+
+void LLFloaterRegionRestartSchedule::onCommitHours(const LLSD& value)
+{
+ S32 hours = value.asInteger();
+ if (mPMAMButton->getVisible())
+ {
+ // 0:00 equals 12:00 AM 1:00 equals 1:00 AM, 12am < 1am < 2am < 3am...
+ if (hours == 0) hours = 12;
+ llclamp(hours, 1, 12);
+ }
+ else
+ {
+ llclamp(hours, 0, 23);
+ }
+ mHoursLineEditor->setText(llformat("%02d", hours));
+ mSaveButton->setEnabled(true);
+}
+
+void LLFloaterRegionRestartSchedule::onCommitMinutes(const LLSD& value)
+{
+ S32 minutes = value.asInteger();
+ llclamp(minutes, 0, 59);
+ mMinutesLineEditor->setText(llformat("%02d", minutes));
+ mSaveButton->setEnabled(true);
+}
+
+void LLFloaterRegionRestartSchedule::resetUI(bool enable_ui)
+{
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl* chk = getChild<LLCheckBoxCtrl>(name);
+ chk->setValue(false);
+ chk->setEnabled(enable_ui);
+ }
+ if (mPMAMButton->getVisible())
+ {
+ mHoursLineEditor->setValue("12");
+ mPMAMButton->setEnabled(enable_ui);
+ }
+ else
+ {
+ mHoursLineEditor->setValue("00");
+ }
+ mMinutesLineEditor->setValue("00");
+ mMinutesLineEditor->setEnabled(enable_ui);
+ mHoursLineEditor->setEnabled(enable_ui);
+ mTimeAM = true;
+ updateAMPM();
+}
+
+void LLFloaterRegionRestartSchedule::updateAMPM()
+{
+ std::string value;
+ if (mTimeAM)
+ {
+ value = getString("am_string");
+ }
+ else
+ {
+ value = getString("pm_string");
+ }
+ mPMAMButton->setLabel(value);
+}
+
+bool LLFloaterRegionRestartSchedule::canUse()
+{
+ std::string url = gAgent.getRegionCapability("RegionSchedule");
+ return !url.empty();
+}
+
+void LLFloaterRegionRestartSchedule::requestRegionShcheduleCoro(std::string url, LLHandle<LLFloater> handle)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("RegionShcheduleRequest", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+
+ httpOpts->setWantHeaders(true);
+
+ LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ LLFloaterRegionRestartSchedule* floater = dynamic_cast<LLFloaterRegionRestartSchedule*>(handle.get());
+ if (!floater)
+ {
+ LL_DEBUGS("Region") << "Region Restart Schedule floater is already dead" << LL_ENDL;
+ }
+ else if (!status)
+ {
+ LL_WARNS("Region") << "Failed to get region schedule: " << status.toString() << LL_ENDL;
+ floater->resetUI(false);
+ }
+ else if (!result.has("restart"))
+ {
+ floater->resetUI(true); // no restart schedule yet
+ }
+ else
+ {
+ // example: 'restart':{'days':'TR','time':i7200,'type':'W'}
+ LLSD &restart = result["restart"];
+ std::string type = restart["type"];
+ std::string days = restart["days"];
+ if (type == "W") // weekly || restart.has("days")
+ {
+ LLStringUtil::toLower(days);
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ bool enabled = days.find(c) != std::string::npos;
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl *chk = floater->getChild<LLCheckBoxCtrl>(name);
+ chk->setValue(enabled);
+ chk->setEnabled(true);
+ }
+ }
+ else // dayly
+ {
+ for (char c : CHECKBOX_PREFIXES)
+ {
+ std::string name = c + CHECKBOX_NAME;
+ LLCheckBoxCtrl* chk = floater->getChild<LLCheckBoxCtrl>(name);
+ chk->setValue(true);
+ chk->setEnabled(true);
+ }
+ }
+
+ S32 seconds_after_midnight = restart["time"].asInteger();
+ S32 hours = seconds_after_midnight / 3600;
+ S32 minutes = (seconds_after_midnight % 3600) / 60;
+
+ if (floater->mPMAMButton->getVisible())
+ {
+ if (hours >= 12)
+ {
+ hours -= 12;
+ floater->mTimeAM = false;
+ }
+ else
+ {
+ floater->mTimeAM = true;
+ }
+ if (hours == 0)
+ {
+ hours = 12; // 0:00 equals 12:00 AM , 1:00 equals 1:00 AM
+ }
+ floater->mPMAMButton->setEnabled(true);
+ }
+ else
+ {
+ floater->mTimeAM = true;
+ }
+ floater->updateAMPM();
+ floater->mHoursLineEditor->setText(llformat("%02d", hours));
+ floater->mHoursLineEditor->setEnabled(true);
+ floater->mMinutesLineEditor->setText(llformat("%02d", minutes));
+ floater->mMinutesLineEditor->setEnabled(true);
+
+ LL_DEBUGS("Region") << "Region restart schedule type: " << type
+ << " Days: " << days
+ << " Time:" << hours << ":" << minutes << LL_ENDL;
+ }
+}
+
+void LLFloaterRegionRestartSchedule::setRegionShcheduleCoro(std::string url, LLSD body, LLHandle<LLFloater> handle)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("RegionShcheduleSetter", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+
+ httpOpts->setWantHeaders(true);
+
+ LLSD result = httpAdapter->postAndSuspend(httpRequest, url, body, httpOpts);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ LLFloaterRegionRestartSchedule* floater = dynamic_cast<LLFloaterRegionRestartSchedule*>(handle.get());
+ if (floater)
+ {
+ floater->closeFloater();
+ }
+}
diff --git a/indra/newview/llfloaterregionrestartschedule.h b/indra/newview/llfloaterregionrestartschedule.h
new file mode 100644
index 0000000000..465ed538a5
--- /dev/null
+++ b/indra/newview/llfloaterregionrestartschedule.h
@@ -0,0 +1,74 @@
+/**
+ * @file llfloaterregionrestartschedule.h
+ * @author Andrii Kleshchev
+ * @brief LLFloaterRegionRestartSchedule class header file
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2024, Linden Research, Inc.
+ *
+ * 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
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERREGIONRESTARTSCHEDULE_H
+#define LL_LLFLOATERREGIONRESTARTSCHEDULE_H
+
+#include "llfloater.h"
+
+class LLLineEditor;
+class LLButton;
+
+class LLFloaterRegionRestartSchedule : public LLFloater
+{
+public:
+ LLFloaterRegionRestartSchedule(LLView* owner);
+
+ virtual ~LLFloaterRegionRestartSchedule();
+
+ bool postBuild() override;
+ void onOpen(const LLSD& key) override;
+ void draw() override;
+
+ void onPMAMButtonClicked();
+ void onSaveButtonClicked();
+
+ void onCommitHours(const LLSD& value);
+ void onCommitMinutes(const LLSD& value);
+
+ void resetUI(bool enable_ui);
+ void updateAMPM();
+
+ static bool canUse();
+
+protected:
+ static void requestRegionShcheduleCoro(std::string url, LLHandle<LLFloater> handle);
+ static void setRegionShcheduleCoro(std::string url, LLSD body, LLHandle<LLFloater> handle);
+
+ LLHandle<LLView> mOwnerHandle;
+ F32 mContextConeOpacity{ 0.f };
+
+ LLLineEditor* mHoursLineEditor{nullptr};
+ LLLineEditor* mMinutesLineEditor{ nullptr };
+ LLButton* mPMAMButton{ nullptr };
+ LLButton* mSaveButton{ nullptr };
+ LLButton* mCancelButton{ nullptr };
+
+ bool mTimeAM{ true };
+};
+
+#endif // LL_LLFLOATERREGIONRESTARTSCHEDULE_H
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 7623ab56a5..ac64c47abe 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -3276,6 +3276,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("VoiceSignalingRequest");
capabilityNames.append("ReadOfflineMsgs"); // Requires to respond reliably: AcceptFriendship, AcceptGroupInvite, DeclineFriendship, DeclineGroupInvite
capabilityNames.append("RegionObjects");
+ capabilityNames.append("RegionSchedule");
capabilityNames.append("RemoteParcelRequest");
capabilityNames.append("RenderMaterials");
capabilityNames.append("RequestTextureDownload");
diff --git a/indra/newview/skins/default/xui/en/floater_region_restart_schedule.xml b/indra/newview/skins/default/xui/en/floater_region_restart_schedule.xml
new file mode 100644
index 0000000000..fd04acde35
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_region_restart_schedule.xml
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ height="180"
+ layout="topleft"
+ name="floater_region_restart_schedule"
+ help_topic="Preferences_Graphics_Advanced"
+ single_instance="true"
+ save_rect="true"
+ title="REGION RESTART SCHEDULE"
+ width="300">
+
+<!-- This block shows Advanced Settings -->
+ <floater.string name="am_string">am</floater.string>
+ <floater.string name="pm_string">pm</floater.string>
+
+ <text
+ name="days_general"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ height="16"
+ top="15"
+ left="20"
+ width="328">
+ Restart the region on following days:
+ </text>
+
+ <check_box
+ name="s_chk"
+ label=""
+ tool_tip="Sunday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left="60"
+ top_pad="5" />
+
+ <check_box
+ name="m_chk"
+ label=""
+ tool_tip="Monday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="t_chk"
+ label=""
+ tool_tip="Tuesday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="w_chk"
+ label=""
+ tool_tip="Wednesday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="r_chk"
+ label=""
+ tool_tip="Thursday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="f_chk"
+ label=""
+ tool_tip="Friday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <check_box
+ name="a_chk"
+ label=""
+ tool_tip="Saturday"
+ follows="left|top"
+ layout="topleft"
+ height="20"
+ width="20"
+ left_pad="5"
+ top_delta="0" />
+
+ <text
+ name="su_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_pad="5"
+ left="57"
+ width="25">
+ Su
+ </text>
+
+ <text
+ name="mo_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Mo
+ </text>
+
+ <text
+ name="tu_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Tu
+ </text>
+
+ <text
+ name="we_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="1"
+ width="25">
+ We
+ </text>
+
+ <text
+ name="th_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Th
+ </text>
+
+ <text
+ name="fr_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Fr
+ </text>
+
+ <text
+ name="sa_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="0"
+ left_pad="0"
+ width="25">
+ Sa
+ </text>
+
+ <text
+ name="at_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="right"
+ height="16"
+ top_pad="15"
+ left="30"
+ width="40">
+ at
+ </text>
+ <line_editor
+ name="hours_edt"
+ max_length_bytes="2"
+ follows="left|top"
+ layout="topleft"
+ commit_on_focus_lost="true"
+ height="23"
+ width="40"
+ left_pad="4"
+ top_delta="-5"/>
+ <text
+ name="separator_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ halign="center"
+ height="16"
+ top_delta="5"
+ left_pad="0"
+ width="12">
+ :
+ </text>
+ <line_editor
+ name="minutes_edt"
+ max_length_bytes="2"
+ follows="left|top"
+ layout="topleft"
+ commit_on_focus_lost="true"
+ height="23"
+ width="40"
+ left_pad="0"
+ top_delta="-5"/>
+ <button
+ name="am_pm_btn"
+ label="am"
+ follows="left|top"
+ layout="topleft"
+ height="23"
+ width="40"
+ left_pad="1"
+ top_delta="0"/>
+ <text
+ name="utc_label"
+ type="string"
+ follows="left|top"
+ layout="topleft"
+ height="16"
+ top_delta="5"
+ left_pad="5"
+ width="22">
+ UTC
+ </text>
+ <button
+ name="save_btn"
+ label="Save"
+ follows="top|left"
+ layout="topleft"
+ top="145"
+ left="25"
+ height="25"
+ width="110"/>
+ <button
+ name="cancel_btn"
+ label="Cancel"
+ follows="bottom|right"
+ layout="topleft"
+ left_pad="20"
+ top_delta="0"
+ height="25"
+ width="110"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 74d21c436e..6ef1b6e44a 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -270,8 +270,20 @@
left="250"
name="manage_telehub_btn"
top="70"
- width="150">
+ width="160">
<button.commit_callback
function="RegionInfo.ManageTelehub" />
</button>
+ <button
+ follows="left|top"
+ height="20"
+ label="Manage Restart Schedule..."
+ layout="topleft"
+ name="manage_restart_btn"
+ top_pad="5"
+ left_delta="0"
+ width="160">
+ <button.commit_callback
+ function="RegionInfo.ManageRestart" />
+ </button>
</panel>