mirror of
https://github.com/FirestormViewer/phoenix-firestorm.git
synced 2026-08-14 08:53:53 +00:00
Merge branch 'master' of https://github.com/FirestormViewer/phoenix-firestorm
This commit is contained in:
@@ -0,0 +1,251 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Remove or relocate locale XUI attributes that do not exist on matching EN elements."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
import sys
|
||||
from collections import defaultdict
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||||
|
||||
from translation_strings_auditing_tool import ( # noqa: E402
|
||||
SKINS_ROOT,
|
||||
collect_files,
|
||||
compare_extra_attributes,
|
||||
extract_element_attrs,
|
||||
parse_xml,
|
||||
)
|
||||
|
||||
STRUCTURAL_ATTRS = frozenset({
|
||||
"relwidth", "follows", "font", "initial_value", "label_width", "vlabel",
|
||||
"unit_label",
|
||||
})
|
||||
|
||||
ATTR_RE = r'(\s{attr}="[^"]*"|\s{attr}=\'[^\']*\')'
|
||||
ATTR_RE_TMPL = r'(\s{attr}="[^"]*"|\s{attr}=\'[^\']*\')'
|
||||
|
||||
|
||||
@dataclass
|
||||
class FixAction:
|
||||
element: str
|
||||
attr: str
|
||||
value: str
|
||||
hint: str
|
||||
en_attrs: dict[str, str]
|
||||
|
||||
|
||||
def attr_pattern(attr: str) -> re.Pattern[str]:
|
||||
return re.compile(
|
||||
rf'\s+{re.escape(attr)}="[^"]*"|\s+{re.escape(attr)}=\'[^\']*\'',
|
||||
)
|
||||
|
||||
|
||||
def line_has_name(line: str, name: str) -> bool:
|
||||
return bool(re.search(rf'name\s*=\s*["\']{re.escape(name)}["\']', line))
|
||||
|
||||
|
||||
def remove_attr(line: str, attr: str) -> str:
|
||||
return attr_pattern(attr).sub("", line, count=1)
|
||||
|
||||
|
||||
def apply_line_fixes(line: str, actions: list[FixAction]) -> str:
|
||||
if not any(line_has_name(line, a.element[1:]) for a in actions):
|
||||
return line
|
||||
|
||||
for action in actions:
|
||||
name = action.element[1:]
|
||||
if not line_has_name(line, name):
|
||||
continue
|
||||
|
||||
attr = action.attr
|
||||
value = action.value
|
||||
hint = action.hint
|
||||
en_attrs = action.en_attrs
|
||||
|
||||
if attr == "gnoretext":
|
||||
line = remove_attr(line, "gnoretext")
|
||||
if value and "ignoretext=" not in line:
|
||||
line = line.replace(
|
||||
f'name="{name}"',
|
||||
f'ignoretext="{value.replace(chr(34), """)}" name="{name}"',
|
||||
1,
|
||||
)
|
||||
continue
|
||||
|
||||
if attr == "tooltip" and "tool_tip" in hint:
|
||||
line = remove_attr(line, "tooltip")
|
||||
if value and "tool_tip=" not in line:
|
||||
line = line.replace(
|
||||
f'name="{name}"',
|
||||
f'tool_tip="{value.replace(chr(34), """)}" name="{name}"',
|
||||
1,
|
||||
)
|
||||
continue
|
||||
|
||||
if attr == "text" and "EN uses label" in hint:
|
||||
line = remove_attr(line, "text")
|
||||
continue
|
||||
|
||||
if attr == "title" and "EN uses label" in hint:
|
||||
line = remove_attr(line, "title")
|
||||
if value and "label=" not in line:
|
||||
line = line.replace(
|
||||
f'name="{name}"',
|
||||
f'label="{value.replace(chr(34), """)}" name="{name}"',
|
||||
1,
|
||||
)
|
||||
continue
|
||||
|
||||
if attr == "label" and "EN uses title" in hint:
|
||||
line = remove_attr(line, "label")
|
||||
if value and "title=" not in line:
|
||||
line = line.replace(
|
||||
f'name="{name}"',
|
||||
f'title="{value.replace(chr(34), """)}" name="{name}"',
|
||||
1,
|
||||
)
|
||||
continue
|
||||
|
||||
if attr == "label" and "EN uses value" in hint:
|
||||
line = remove_attr(line, "label")
|
||||
if value and "value=" not in line:
|
||||
line = line.replace(
|
||||
f'name="{name}"',
|
||||
f'value="{value.replace(chr(34), """)}" name="{name}"',
|
||||
1,
|
||||
)
|
||||
continue
|
||||
|
||||
if attr == "ignoretext" and f'name="{name}"' in line and 'name="okcancelbuttons"' in line:
|
||||
line = line.replace('name="okcancelbuttons"', 'name="okcancelignore"', 1)
|
||||
continue
|
||||
|
||||
if attr == "label" and value and "tool_tip" in en_attrs and "label" not in en_attrs:
|
||||
en_tip = en_attrs.get("tool_tip", "")
|
||||
if "tool_tip=" in line:
|
||||
tip_m = re.search(r'tool_tip="([^"]*)"', line)
|
||||
loc_tip = tip_m.group(1) if tip_m else ""
|
||||
if not loc_tip or loc_tip == en_tip:
|
||||
line = re.sub(
|
||||
r'tool_tip="[^"]*"',
|
||||
f'tool_tip="{value.replace(chr(34), """)}"',
|
||||
line,
|
||||
count=1,
|
||||
)
|
||||
else:
|
||||
line = line.replace(
|
||||
f'name="{name}"',
|
||||
f'tool_tip="{value.replace(chr(34), """)}" name="{name}"',
|
||||
1,
|
||||
)
|
||||
line = remove_attr(line, "label")
|
||||
continue
|
||||
|
||||
line = remove_attr(line, attr)
|
||||
|
||||
return line
|
||||
|
||||
|
||||
def fix_file_content(content: str, actions: list[FixAction]) -> tuple[str, int]:
|
||||
by_name: dict[str, list[FixAction]] = defaultdict(list)
|
||||
for action in actions:
|
||||
by_name[action.element[1:]].append(action)
|
||||
|
||||
lines = content.splitlines(keepends=True)
|
||||
fixed = 0
|
||||
out: list[str] = []
|
||||
for line in lines:
|
||||
new_line = line
|
||||
for name, name_actions in by_name.items():
|
||||
if line_has_name(line, name):
|
||||
before = new_line
|
||||
new_line = apply_line_fixes(new_line, name_actions)
|
||||
if new_line != before:
|
||||
fixed += len(name_actions)
|
||||
out.append(new_line)
|
||||
return "".join(out), fixed
|
||||
|
||||
|
||||
def fix_file(skin: str, locale: str, rel: str, issues) -> int:
|
||||
locale_path = SKINS_ROOT / skin / "xui" / locale / rel
|
||||
en_path = SKINS_ROOT / skin / "xui" / "en" / rel
|
||||
en_root = parse_xml(en_path)
|
||||
if en_root is None or not locale_path.exists():
|
||||
return 0
|
||||
|
||||
en_elems = extract_element_attrs(en_root, rel)
|
||||
actions = [
|
||||
FixAction(
|
||||
element=i.element,
|
||||
attr=i.attr,
|
||||
value=i.value,
|
||||
hint=i.hint,
|
||||
en_attrs=en_elems.get(i.element, {}),
|
||||
)
|
||||
for i in issues
|
||||
]
|
||||
|
||||
original = locale_path.read_text(encoding="utf-8")
|
||||
updated, count = fix_file_content(original, actions)
|
||||
if updated != original:
|
||||
locale_path.write_text(updated, encoding="utf-8", newline="")
|
||||
return count
|
||||
|
||||
|
||||
def count_remaining() -> int:
|
||||
return len(collect_all_issues())
|
||||
|
||||
|
||||
def collect_all_issues() -> list[tuple[str, str, str, object]]:
|
||||
issues: list[tuple[str, str, str, object]] = []
|
||||
skins = sorted(
|
||||
p.name for p in SKINS_ROOT.iterdir()
|
||||
if p.is_dir() and (p / "xui" / "en").is_dir()
|
||||
)
|
||||
for skin in skins:
|
||||
en_files = collect_files(SKINS_ROOT / skin / "xui" / "en")
|
||||
for loc_dir in sorted((SKINS_ROOT / skin / "xui").iterdir()):
|
||||
if not loc_dir.is_dir() or loc_dir.name == "en":
|
||||
continue
|
||||
locale = loc_dir.name
|
||||
loc_files = collect_files(loc_dir)
|
||||
for rel in sorted(set(en_files) & set(loc_files)):
|
||||
en_root = parse_xml(en_files[rel])
|
||||
loc_root = parse_xml(loc_files[rel])
|
||||
if en_root is None or loc_root is None:
|
||||
continue
|
||||
file_issues = compare_extra_attributes(
|
||||
extract_element_attrs(en_root, rel),
|
||||
extract_element_attrs(loc_root, rel),
|
||||
)
|
||||
for issue in file_issues:
|
||||
issues.append((skin, locale, rel, issue))
|
||||
return issues
|
||||
|
||||
|
||||
def main() -> int:
|
||||
total_fixed = 0
|
||||
files_touched = 0
|
||||
|
||||
grouped: dict[tuple[str, str, str], list] = defaultdict(list)
|
||||
for skin, locale, rel, issue in collect_all_issues():
|
||||
grouped[(skin, locale, rel)].append(issue)
|
||||
|
||||
for (skin, locale, rel), issues in sorted(grouped.items()):
|
||||
count = fix_file(skin, locale, rel, issues)
|
||||
if count:
|
||||
files_touched += 1
|
||||
total_fixed += count
|
||||
print(f"fixed {count:3d} {skin}/{locale}/{rel}")
|
||||
|
||||
remaining = count_remaining()
|
||||
print(f"\nTotal attributes fixed: {total_fixed} in {files_touched} files")
|
||||
print(f"Remaining bad attributes: {remaining}")
|
||||
return 0 if remaining == 0 else 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -27618,6 +27618,19 @@ Change of this parameter will affect the layout of buttons in notification toast
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<!-- <FS:minerjr> [FIRE-36763] - Add rule sets to Omnifilter -->
|
||||
<key>OmnifilterRuleSetID</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The id of the current rule set for the Omnifilter.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>-1</integer>
|
||||
</map>
|
||||
<!-- </FS:minerjr> [FIRE-36763] -->
|
||||
<key>FSAutoOrderIMTabs</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
||||
@@ -51,6 +51,7 @@ namespace
|
||||
constexpr char SETTING_KEY[] = "FSInventoryCustomTabs";
|
||||
constexpr char DEFAULT_NAME_KEY[] = "FSInventoryCustomTabDefaultName";
|
||||
constexpr char RENAME_NOTIFY[] = "FSInventoryCustomTabRename";
|
||||
constexpr char CLOSE_NOTIFY[] = "FSInventoryCustomTabClose";
|
||||
constexpr char MENU_FILE[] = "menu_inventory_custom_tab.xml";
|
||||
constexpr char ADD_TAB_PANEL_NAME[] = "FSInventoryCustomTabAdd";
|
||||
constexpr char ADD_TAB_LABEL[] = "+";
|
||||
@@ -114,6 +115,11 @@ FSInventoryCustomTabs::~FSInventoryCustomTabs()
|
||||
LLNotifications::instance().cancel(mRenameNotification);
|
||||
mRenameNotification.reset();
|
||||
}
|
||||
if (mCloseNotification)
|
||||
{
|
||||
LLNotifications::instance().cancel(mCloseNotification);
|
||||
mCloseNotification.reset();
|
||||
}
|
||||
if (mAddClickConnection.connected())
|
||||
{
|
||||
mAddClickConnection.disconnect();
|
||||
@@ -611,8 +617,47 @@ void FSInventoryCustomTabs::onCloseClicked()
|
||||
return;
|
||||
}
|
||||
|
||||
auto* to_remove = mContextPanel;
|
||||
mContextPanel = nullptr;
|
||||
if (mCloseNotification)
|
||||
{
|
||||
LLNotifications::instance().cancel(mCloseNotification);
|
||||
mCloseNotification.reset();
|
||||
}
|
||||
|
||||
LLSD args;
|
||||
args["NAME"] = mContextPanel->getLabel();
|
||||
LLSD payload;
|
||||
payload["panel_name"] = mContextPanel->getName();
|
||||
|
||||
auto handle = getHandle();
|
||||
mCloseNotification = LLNotificationsUtil::add(CLOSE_NOTIFY, args, payload,
|
||||
[handle](const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
if (auto* self = handle.get())
|
||||
{
|
||||
self->onCloseConfirmed(notification, response);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void FSInventoryCustomTabs::onCloseConfirmed(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
mCloseNotification.reset();
|
||||
|
||||
if (LLNotificationsUtil::getSelectedOption(notification, response) != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
auto* to_remove = dynamic_cast<LLInventoryPanel*>(mTabs->getPanelByName(notification["payload"]["panel_name"].asString()));
|
||||
if (!isCustomTab(to_remove) || !mTabs)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (mContextPanel == to_remove)
|
||||
{
|
||||
mContextPanel = nullptr;
|
||||
}
|
||||
if (mLastActivePanel == to_remove)
|
||||
{
|
||||
mLastActivePanel = nullptr;
|
||||
|
||||
@@ -91,6 +91,7 @@ private:
|
||||
void installAddTab();
|
||||
void onSettingChangedExternally();
|
||||
void onRenameConfirmed(const LLSD& notification, const LLSD& response);
|
||||
void onCloseConfirmed(const LLSD& notification, const LLSD& response);
|
||||
void onFilterFocusLost();
|
||||
void onClosePressed(LLInventoryPanel* panel);
|
||||
void doLoad();
|
||||
@@ -116,6 +117,7 @@ private:
|
||||
LLInventoryPanel* mAddTabPanel{ nullptr };
|
||||
LLInventoryPanel* mLastActivePanel{ nullptr };
|
||||
LLNotificationPtr mRenameNotification;
|
||||
LLNotificationPtr mCloseNotification;
|
||||
boost::signals2::connection mSettingConnection;
|
||||
boost::signals2::connection mAddClickConnection;
|
||||
bool mSaving{ false };
|
||||
|
||||
@@ -2486,10 +2486,14 @@ void LLAgent::propagate(const F32 dt)
|
||||
LLVector3 land_vel = getVelocity();
|
||||
land_vel.mV[VZ] = 0.f;
|
||||
|
||||
static LLCachedControl<bool> automatic_fly(gSavedSettings, "AutomaticFly", true); // <FS:PP> Speed optimisation
|
||||
if (!in_air
|
||||
&& gAgentCamera.getUpKey() < 0
|
||||
&& land_vel.magVecSquared() < MAX_VELOCITY_AUTO_LAND_SQUARED
|
||||
&& gSavedSettings.getBOOL("AutomaticFly"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// && gSavedSettings.getBOOL("AutomaticFly"))
|
||||
&& automatic_fly())
|
||||
// </FS:PP>
|
||||
{
|
||||
// land automatically
|
||||
setFlying(false);
|
||||
@@ -5546,7 +5550,11 @@ void LLAgent::setTeleportState(ETeleportState state)
|
||||
<< teleportStateName(mTeleportState) << "(" << mTeleportState << ")"
|
||||
<< LL_ENDL;
|
||||
mTeleportState = state;
|
||||
if (mTeleportState > TELEPORT_NONE && gSavedSettings.getBOOL("FreezeTime"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// if (mTeleportState > TELEPORT_NONE && gSavedSettings.getBOOL("FreezeTime"))
|
||||
static LLCachedControl<bool> freeze_time(gSavedSettings, "FreezeTime", false);
|
||||
if (mTeleportState > TELEPORT_NONE && freeze_time())
|
||||
// </FS:PP>
|
||||
{
|
||||
LLFloaterReg::hideInstance("snapshot");
|
||||
}
|
||||
|
||||
@@ -230,15 +230,12 @@ void LLAgentCamera::init()
|
||||
mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPresetType");
|
||||
|
||||
// [RLVa:KB] - @setcam_eyeoffset, @setcam_focusoffset and @setcam_eyeoffsetscale
|
||||
if (RlvActions::isRlvEnabled())
|
||||
{
|
||||
mRlvCameraOffsetInitialControl = gSavedSettings.declareVec3("CameraOffsetRLVaView", LLVector3::zero, "Declared in code", LLControlVariable::PERSIST_NO);
|
||||
mRlvCameraOffsetInitialControl->setHiddenFromSettingsEditor(true);
|
||||
mRlvCameraOffsetScaleControl = gSavedSettings.declareF32("CameraOffsetScaleRLVa", 0.0f, "Declared in code", LLControlVariable::PERSIST_NO);
|
||||
mRlvCameraOffsetScaleControl->setHiddenFromSettingsEditor(true);
|
||||
mRlvFocusOffsetInitialControl = gSavedSettings.declareVec3d("FocusOffsetRLVaView", LLVector3d::zero, "Declared in code", LLControlVariable::PERSIST_NO);
|
||||
mRlvFocusOffsetInitialControl->setHiddenFromSettingsEditor(true);
|
||||
}
|
||||
mRlvCameraOffsetInitialControl = gSavedSettings.declareVec3("CameraOffsetRLVaView", LLVector3::zero, "Declared in code", LLControlVariable::PERSIST_NO);
|
||||
mRlvCameraOffsetInitialControl->setHiddenFromSettingsEditor(true);
|
||||
mRlvCameraOffsetScaleControl = gSavedSettings.declareF32("CameraOffsetScaleRLVa", 0.0f, "Declared in code", LLControlVariable::PERSIST_NO);
|
||||
mRlvCameraOffsetScaleControl->setHiddenFromSettingsEditor(true);
|
||||
mRlvFocusOffsetInitialControl = gSavedSettings.declareVec3d("FocusOffsetRLVaView", LLVector3d::zero, "Declared in code", LLControlVariable::PERSIST_NO);
|
||||
mRlvFocusOffsetInitialControl->setHiddenFromSettingsEditor(true);
|
||||
// [/RLVa:KB]
|
||||
|
||||
mCameraCollidePlane.clearVec();
|
||||
@@ -345,7 +342,11 @@ void LLAgentCamera::resetView(bool reset_camera, bool change_camera, bool moveme
|
||||
{
|
||||
// </FS:CR>
|
||||
|
||||
if (change_camera && !gSavedSettings.getBOOL("FreezeTime"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// if (change_camera && !gSavedSettings.getBOOL("FreezeTime"))
|
||||
static LLCachedControl<bool> freeze_time(gSavedSettings, "FreezeTime", false);
|
||||
if (change_camera && !freeze_time)
|
||||
// </FS:PP>
|
||||
{
|
||||
changeCameraToDefault();
|
||||
|
||||
@@ -373,7 +374,10 @@ void LLAgentCamera::resetView(bool reset_camera, bool change_camera, bool moveme
|
||||
}
|
||||
|
||||
|
||||
if (reset_camera && !gSavedSettings.getBOOL("FreezeTime"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// if (reset_camera && !gSavedSettings.getBOOL("FreezeTime"))
|
||||
if (reset_camera && !freeze_time)
|
||||
// </FS:PP>
|
||||
{
|
||||
if (!gViewerWindow->getLeftMouseDown() && cameraThirdPerson())
|
||||
{
|
||||
@@ -1068,7 +1072,11 @@ void LLAgentCamera::cameraOrbitIn(const F32 meters)
|
||||
|
||||
mCameraZoomFraction = (mTargetCameraDistance - meters) / camera_offset_dist;
|
||||
|
||||
if (!gSavedSettings.getBOOL("FreezeTime") && mCameraZoomFraction < MIN_ZOOM_FRACTION && meters > 0.f)
|
||||
// <FS:PP> Speed optimisation
|
||||
// if (!gSavedSettings.getBOOL("FreezeTime") && mCameraZoomFraction < MIN_ZOOM_FRACTION && meters > 0.f)
|
||||
static LLCachedControl<bool> freeze_time(gSavedSettings, "FreezeTime", false);
|
||||
if (!freeze_time && mCameraZoomFraction < MIN_ZOOM_FRACTION && meters > 0.f)
|
||||
// </FS:PP>
|
||||
{
|
||||
// No need to animate, camera is already there.
|
||||
changeCameraToMouselook(false);
|
||||
@@ -1271,8 +1279,15 @@ void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y)
|
||||
F32 y_from_center =
|
||||
((F32) mouse_y / (F32) gViewerWindow->getWorldViewHeightScaled() ) - 0.5f;
|
||||
|
||||
frameCamera.yaw( - x_from_center * gSavedSettings.getF32("YawFromMousePosition") * DEG_TO_RAD);
|
||||
frameCamera.pitch( - y_from_center * gSavedSettings.getF32("PitchFromMousePosition") * DEG_TO_RAD);
|
||||
// <FS:PP> Speed optimisation
|
||||
// frameCamera.yaw( - x_from_center * gSavedSettings.getF32("YawFromMousePosition") * DEG_TO_RAD);
|
||||
// frameCamera.pitch( - y_from_center * gSavedSettings.getF32("PitchFromMousePosition") * DEG_TO_RAD);
|
||||
static LLCachedControl<F32> yaw_from_mouse_position(gSavedSettings, "YawFromMousePosition", 90.f);
|
||||
static LLCachedControl<F32> pitch_from_mouse_position(gSavedSettings, "PitchFromMousePosition", 90.f);
|
||||
frameCamera.yaw( - x_from_center * yaw_from_mouse_position() * DEG_TO_RAD);
|
||||
frameCamera.pitch( - y_from_center * pitch_from_mouse_position() * DEG_TO_RAD);
|
||||
// </FS:PP>
|
||||
|
||||
lookAtType = LOOKAT_TARGET_FREELOOK;
|
||||
}
|
||||
|
||||
@@ -1569,7 +1584,11 @@ void LLAgentCamera::updateCamera()
|
||||
{
|
||||
const F32 SMOOTHING_HALF_LIFE = 0.02f;
|
||||
|
||||
F32 smoothing = LLSmoothInterpolation::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, false);
|
||||
// <FS:PP> Speed optimisation
|
||||
// F32 smoothing = LLSmoothInterpolation::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, false);
|
||||
static LLCachedControl<F32> camera_position_smoothing(gSavedSettings, "CameraPositionSmoothing", 1.f);
|
||||
F32 smoothing = LLSmoothInterpolation::getInterpolant(camera_position_smoothing() * SMOOTHING_HALF_LIFE, false);
|
||||
// </FS:PP>
|
||||
|
||||
if (mFocusOnAvatar && !mFocusObject) // we differentiate on avatar mode
|
||||
{
|
||||
@@ -2303,7 +2322,9 @@ LLVector3d LLAgentCamera::getFocusOffsetInitial()
|
||||
// [RLVa:KB] - @setcam_eyeoffsetscale
|
||||
F32 LLAgentCamera::getCameraOffsetScale() const
|
||||
{
|
||||
return gSavedSettings.getF32( (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? "CameraOffsetScale" : "CameraOffsetScaleRLVa");
|
||||
static LLCachedControl<F32> camera_offset_scale(gSavedSettings, "CameraOffsetScale", 1.f);
|
||||
static LLCachedControl<F32> camera_offset_scale_rlva(gSavedSettings, "CameraOffsetScaleRLVa", 0.f);
|
||||
return (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? camera_offset_scale() : camera_offset_scale_rlva();
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
|
||||
@@ -824,7 +824,7 @@ void LLBumpImageList::generateNormalMapFromAlpha(LLImageRaw* src, LLImageRaw* nr
|
||||
|
||||
// <FS:PP> Attempt to speed up things a little
|
||||
// F32 norm_scale = gSavedSettings.getF32("RenderNormalMapScale");
|
||||
static LLCachedControl<F32> RenderNormalMapScale(gSavedSettings, "RenderNormalMapScale");
|
||||
static LLCachedControl<F32> RenderNormalMapScale(gSavedSettings, "RenderNormalMapScale", 64.f);
|
||||
F32 norm_scale = RenderNormalMapScale;
|
||||
// </FS:PP>
|
||||
|
||||
@@ -935,7 +935,11 @@ void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_cod
|
||||
static LLStaticHashedString sStepY("stepY");
|
||||
static LLStaticHashedString sBumpCode("bump_code");
|
||||
|
||||
gNormalMapGenProgram.uniform1f(sNormScale, gSavedSettings.getF32("RenderNormalMapScale"));
|
||||
// <FS:PP> Speed optimisation
|
||||
// gNormalMapGenProgram.uniform1f(sNormScale, gSavedSettings.getF32("RenderNormalMapScale"));
|
||||
static LLCachedControl<F32> RenderNormalMapScale(gSavedSettings, "RenderNormalMapScale", 64.f);
|
||||
gNormalMapGenProgram.uniform1f(sNormScale, RenderNormalMapScale());
|
||||
// </FS:PP>
|
||||
gNormalMapGenProgram.uniform1f(sStepX, 1.f / bump->getWidth());
|
||||
gNormalMapGenProgram.uniform1f(sStepY, 1.f / bump->getHeight());
|
||||
gNormalMapGenProgram.uniform1i(sBumpCode, bump_code);
|
||||
|
||||
@@ -5209,9 +5209,10 @@ void LLSelectMgr::deselectAllIfTooFar()
|
||||
// if (gSavedSettings.getBOOL("LimitSelectDistance")
|
||||
// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-0.2.0f
|
||||
static RlvCachedBehaviourModifier<float> s_nFartouchDist(RLV_MODIFIER_FARTOUCHDIST);
|
||||
|
||||
static LLCachedControl<bool> limit_select_distance(gSavedSettings, "LimitSelectDistance", true);
|
||||
static LLCachedControl<F32> max_select_distance(gSavedSettings, "MaxSelectDistance", 128.f);
|
||||
bool fRlvFartouch = gRlvHandler.hasBehaviour(RLV_BHVR_FARTOUCH) && LLToolMgr::instance().inEdit();
|
||||
if ( (gSavedSettings.getBOOL("LimitSelectDistance") || (fRlvFartouch) )
|
||||
if ( (limit_select_distance() || (fRlvFartouch) )
|
||||
// [/RLVa:KB]
|
||||
&& (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar())
|
||||
&& (mSelectedObjects->getPrimaryObject() != LLViewerMediaFocus::getInstance()->getFocusedObject())
|
||||
@@ -5220,7 +5221,7 @@ void LLSelectMgr::deselectAllIfTooFar()
|
||||
{
|
||||
// F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance");
|
||||
// [RLVa:KB] - Checked: 2010-04-11 (RLVa-1.2.0e) | Modified: RLVa-0.2.0f
|
||||
F32 deselect_dist = (!fRlvFartouch) ? gSavedSettings.getF32("MaxSelectDistance") : s_nFartouchDist;
|
||||
F32 deselect_dist = (!fRlvFartouch) ? (F32)max_select_distance() : s_nFartouchDist;
|
||||
// [/RLVa:KB]
|
||||
F32 deselect_dist_sq = deselect_dist * deselect_dist;
|
||||
|
||||
|
||||
@@ -331,7 +331,11 @@ void LLViewerCamera::setPerspective(bool for_selection,
|
||||
if (limit_select_distance)
|
||||
{
|
||||
// ...select distance from control
|
||||
z_far = gSavedSettings.getF32("MaxSelectDistance");
|
||||
// <FS:PP> Speed optimisation
|
||||
// z_far = gSavedSettings.getF32("MaxSelectDistance");
|
||||
static LLCachedControl<F32> max_select_distance(gSavedSettings, "MaxSelectDistance", 128.f);
|
||||
z_far = max_select_distance();
|
||||
// </FS:PP>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -841,7 +845,8 @@ bool LLViewerCamera::isDefaultFOVChanged()
|
||||
if(mPrevCameraFOVDefault != mCameraFOVDefault)
|
||||
{
|
||||
mPrevCameraFOVDefault = mCameraFOVDefault;
|
||||
return !gSavedSettings.getBOOL("IgnoreFOVZoomForLODs");
|
||||
static LLCachedControl<bool> ignore_fov_zoom_for_lods(gSavedSettings, "IgnoreFOVZoomForLODs", false);
|
||||
return !ignore_fov_zoom_for_lods();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -305,6 +305,12 @@ static void update_tp_display(bool minimized)
|
||||
static LLCachedControl<F32> teleport_arrival_delay(gSavedSettings, "TeleportArrivalDelay");
|
||||
static LLCachedControl<F32> teleport_local_delay(gSavedSettings, "TeleportLocalDelay");
|
||||
|
||||
// <FS:PP> Speed optimisation
|
||||
static LLCachedControl<bool> disable_teleport_screens(gSavedSettings, "FSDisableTeleportScreens", false);
|
||||
static LLCachedControl<bool> reset_camera_on_tp(gSavedSettings, "FSResetCameraOnTP", true);
|
||||
static LLCachedControl<LLVector3> nacl_ml_fov_values(gSavedSettings, "_NACL_MLFovValues", LLVector3(1.047197551f, 1.047197551f, 0.f));
|
||||
// </FS:PP>
|
||||
|
||||
S32 attach_count = 0;
|
||||
if (isAgentAvatarValid())
|
||||
{
|
||||
@@ -337,7 +343,7 @@ static void update_tp_display(bool minimized)
|
||||
const std::string& msg = LLAgent::sTeleportProgressMessages["pending"];
|
||||
if (!minimized)
|
||||
{
|
||||
gViewerWindow->setShowProgress(true, !gSavedSettings.getBOOL("FSDisableTeleportScreens"));
|
||||
gViewerWindow->setShowProgress(true, !disable_teleport_screens()); // <FS:PP> Speed optimisation
|
||||
gViewerWindow->setProgressPercent(llmin(teleport_percent, 0.0f));
|
||||
gViewerWindow->setProgressString(msg);
|
||||
}
|
||||
@@ -356,12 +362,12 @@ static void update_tp_display(bool minimized)
|
||||
// If someone knows how to call "View.ZoomDefault" by hand, we should do that instead of
|
||||
// replicating the behavior here. -Zi
|
||||
LLViewerCamera::instance().setDefaultFOV(DEFAULT_FIELD_OF_VIEW);
|
||||
if (gSavedSettings.getBOOL("FSResetCameraOnTP"))
|
||||
if (reset_camera_on_tp()) // <FS:PP> Speed optimisation
|
||||
{
|
||||
gSavedSettings.setF32("CameraAngle", LLViewerCamera::instance().getView()); // FS:LO Dont reset rightclick zoom when we teleport however. Fixes FIRE-6246.
|
||||
}
|
||||
// also, reset the marker for "currently zooming" in the mouselook zoom settings. -Zi
|
||||
LLVector3 vTemp = gSavedSettings.getVector3("_NACL_MLFovValues");
|
||||
LLVector3 vTemp = nacl_ml_fov_values(); // <FS:PP> Speed optimisation
|
||||
vTemp.mV[VZ] = 0.0f;
|
||||
gSavedSettings.setVector3("_NACL_MLFovValues", vTemp);
|
||||
}
|
||||
@@ -374,7 +380,7 @@ static void update_tp_display(bool minimized)
|
||||
FSData::instance().selectNextMOTD();
|
||||
if (!minimized)
|
||||
{
|
||||
gViewerWindow->setShowProgress(true, !gSavedSettings.getBOOL("FSDisableTeleportScreens"));
|
||||
gViewerWindow->setShowProgress(true, !disable_teleport_screens()); // <FS:PP> Speed optimisation
|
||||
gViewerWindow->setProgressPercent(llmin(teleport_percent, 0.0f));
|
||||
gViewerWindow->setProgressString(msg);
|
||||
gViewerWindow->setProgressMessage(gAgent.mMOTD);
|
||||
|
||||
@@ -107,10 +107,14 @@ bool agent_jump( EKeystate s )
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
static LLCachedControl<bool> automatic_fly(gSavedSettings, "AutomaticFly", true); // <FS:PP> Speed optimisation
|
||||
if( time < FLY_TIME
|
||||
|| frame_count <= FLY_FRAMES
|
||||
|| gAgent.upGrabbed()
|
||||
|| !gSavedSettings.getBOOL("AutomaticFly"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// || !gSavedSettings.getBOOL("AutomaticFly"))
|
||||
|| !automatic_fly())
|
||||
// </FS:PP>
|
||||
{
|
||||
gAgent.moveUp(1);
|
||||
}
|
||||
@@ -166,13 +170,17 @@ static void agent_check_temporary_run(LLAgent::EDoubleTapRunMode mode)
|
||||
|
||||
static void agent_handle_doubletap_run(EKeystate s, LLAgent::EDoubleTapRunMode mode)
|
||||
{
|
||||
static LLCachedControl<bool> allow_tap_tap_hold_run(gSavedSettings, "AllowTapTapHoldRun", true); // <FS:PP> Speed optimisation
|
||||
if (KEYSTATE_UP == s)
|
||||
{
|
||||
// Note: in case shift is already released, slide left/right run
|
||||
// will be released in agent_turn_left()/agent_turn_right()
|
||||
agent_check_temporary_run(mode);
|
||||
}
|
||||
else if (gSavedSettings.getBOOL("AllowTapTapHoldRun") &&
|
||||
// <FS:PP> Speed optimisation
|
||||
// else if (gSavedSettings.getBOOL("AllowTapTapHoldRun") &&
|
||||
else if (allow_tap_tap_hold_run() &&
|
||||
// </FS:PP>
|
||||
KEYSTATE_DOWN == s &&
|
||||
!gAgent.getRunning())
|
||||
{
|
||||
@@ -236,12 +244,16 @@ bool agent_push_backward( EKeystate s )
|
||||
{
|
||||
if(gAgent.isMovementLocked()) return true;
|
||||
|
||||
static LLCachedControl<bool> leave_mouselook(gSavedSettings, "LeaveMouselook", false); // <FS:PP> Speed optimisation
|
||||
//in free camera control mode we need to intercept keyboard events for avatar movements
|
||||
if (LLFloaterCamera::inFreeCameraMode())
|
||||
{
|
||||
camera_move_backward(s);
|
||||
}
|
||||
else if (!gAgent.backwardGrabbed() && gAgentAvatarp->isSitting() && gSavedSettings.getBOOL("LeaveMouselook"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// else if (!gAgent.backwardGrabbed() && gAgentAvatarp->isSitting() && gSavedSettings.getBOOL("LeaveMouselook"))
|
||||
else if (!gAgent.backwardGrabbed() && gAgentAvatarp->isSitting() && leave_mouselook())
|
||||
// </FS:PP>
|
||||
{
|
||||
gAgentCamera.changeCameraToThirdPerson();
|
||||
}
|
||||
|
||||
@@ -1427,7 +1427,11 @@ bool LLViewerJoystick::toggleFlycam()
|
||||
void LLViewerJoystick::scanJoystick()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_INPUT;
|
||||
if (mDriverState != JDS_INITIALIZED || !gSavedSettings.getBOOL("JoystickEnabled"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// if (mDriverState != JDS_INITIALIZED || !gSavedSettings.getBOOL("JoystickEnabled"))
|
||||
static LLCachedControl<bool> joystick_enabled(gSavedSettings, "JoystickEnabled", false);
|
||||
if (mDriverState != JDS_INITIALIZED || !joystick_enabled())
|
||||
// </FS:PP>
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -1460,7 +1464,11 @@ void LLViewerJoystick::scanJoystick()
|
||||
toggle_flycam = 0;
|
||||
}
|
||||
|
||||
if (!mOverrideCamera && !(LLToolMgr::getInstance()->inBuildMode() && gSavedSettings.getBOOL("JoystickBuildEnabled")))
|
||||
// <FS:PP> Speed optimisation
|
||||
// if (!mOverrideCamera && !(LLToolMgr::getInstance()->inBuildMode() && gSavedSettings.getBOOL("JoystickBuildEnabled")))
|
||||
static LLCachedControl<bool> joystick_build_enabled(gSavedSettings, "JoystickBuildEnabled", false);
|
||||
if (!mOverrideCamera && !(LLToolMgr::getInstance()->inBuildMode() && joystick_build_enabled()))
|
||||
// </FS:PP>
|
||||
{
|
||||
moveAvatar();
|
||||
}
|
||||
|
||||
@@ -491,9 +491,17 @@ void update_statistics()
|
||||
|
||||
record(LLStatViewer::TRIANGLES_DRAWN_PER_FRAME, last_frame_recording.getSum(LLStatViewer::TRIANGLES_DRAWN));
|
||||
|
||||
sample(LLStatViewer::ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
|
||||
sample(LLStatViewer::DRAW_DISTANCE, (F64)gSavedSettings.getF32("RenderFarClip"));
|
||||
sample(LLStatViewer::CHAT_BUBBLES, gSavedSettings.getBOOL("UseChatBubbles"));
|
||||
// <FS:PP> Speed optimisation
|
||||
// sample(LLStatViewer::ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
|
||||
// sample(LLStatViewer::DRAW_DISTANCE, (F64)gSavedSettings.getF32("RenderFarClip"));
|
||||
// sample(LLStatViewer::CHAT_BUBBLES, gSavedSettings.getBOOL("UseChatBubbles"));
|
||||
static LLCachedControl<bool> render_vbo_enable(gSavedSettings, "RenderVBOEnable", true);
|
||||
static LLCachedControl<F32> render_far_clip(gSavedSettings, "RenderFarClip", 256.f);
|
||||
static LLCachedControl<bool> use_chat_bubbles(gSavedSettings, "UseChatBubbles", false);
|
||||
sample(LLStatViewer::ENABLE_VBO, (F64)render_vbo_enable());
|
||||
sample(LLStatViewer::DRAW_DISTANCE, (F64)render_far_clip());
|
||||
sample(LLStatViewer::CHAT_BUBBLES, use_chat_bubbles());
|
||||
// </FS:PP>
|
||||
|
||||
typedef LLTrace::StatType<LLTrace::TimeBlockAccumulator>::instance_tracker_t stat_type_t;
|
||||
|
||||
|
||||
@@ -2069,7 +2069,11 @@ bool LLUIImageList::initFromFile()
|
||||
preloadUIImage(image.name, file_name, image.use_mips, image.scale, image.clip, image.scale_type);
|
||||
}
|
||||
|
||||
if (!gSavedSettings.getBOOL("NoPreload"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// if (!gSavedSettings.getBOOL("NoPreload"))
|
||||
static LLCachedControl<bool> no_preload(gSavedSettings, "NoPreload", false);
|
||||
if (!no_preload())
|
||||
// </FS:PP>
|
||||
{
|
||||
if (cur_pass == PASS_DECODE_NOW)
|
||||
{
|
||||
|
||||
@@ -4294,7 +4294,10 @@ void LLViewerWindow::updateLayout()
|
||||
&& tool != gToolNull
|
||||
&& tool != LLToolCompInspect::getInstance()
|
||||
&& tool != LLToolDragAndDrop::getInstance()
|
||||
&& !gSavedSettings.getBOOL("FreezeTime"))
|
||||
// <FS:PP> Speed optimisation
|
||||
// && !gSavedSettings.getBOOL("FreezeTime"))
|
||||
&& !LLPipeline::FreezeTime)
|
||||
// </FS:PP>
|
||||
{
|
||||
// Suppress the toolbox view if our source tool was the pie tool,
|
||||
// and we've overridden to something else.
|
||||
@@ -7397,11 +7400,15 @@ void LLViewerWindow::setUIVisibility(bool visible)
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Notification not showing if hiding the UI
|
||||
FSNearbyChat::instance().showDefaultChatBar(visible && !gSavedSettings.getBOOL("AutohideChatBar"));
|
||||
gSavedSettings.setBOOL("FSInternalShowNavbarNavigationPanel", visible && gSavedSettings.getBOOL("ShowNavbarNavigationPanel"));
|
||||
gSavedSettings.setBOOL("FSInternalShowNavbarFavoritesPanel", visible && gSavedSettings.getBOOL("ShowNavbarFavoritesPanel"));
|
||||
mRootView->getChildView("chiclet_container")->setVisible(visible && gSavedSettings.getBOOL("InternalShowGroupNoticesTopRight"));
|
||||
mRootView->getChildView("chiclet_container_bottom")->setVisible(visible && !gSavedSettings.getBOOL("InternalShowGroupNoticesTopRight"));
|
||||
static LLCachedControl<bool> autohide_chat_bar(gSavedSettings, "AutohideChatBar", false);
|
||||
static LLCachedControl<bool> show_navbar_navigation_panel(gSavedSettings, "ShowNavbarNavigationPanel", false);
|
||||
static LLCachedControl<bool> show_navbar_favorites_panel(gSavedSettings, "ShowNavbarFavoritesPanel", true);
|
||||
static LLCachedControl<bool> internal_show_group_notices_top_right(gSavedSettings, "InternalShowGroupNoticesTopRight", true);
|
||||
FSNearbyChat::instance().showDefaultChatBar(visible && !autohide_chat_bar());
|
||||
gSavedSettings.setBOOL("FSInternalShowNavbarNavigationPanel", visible && show_navbar_navigation_panel());
|
||||
gSavedSettings.setBOOL("FSInternalShowNavbarFavoritesPanel", visible && show_navbar_favorites_panel());
|
||||
mRootView->getChildView("chiclet_container")->setVisible(visible && internal_show_group_notices_top_right());
|
||||
mRootView->getChildView("chiclet_container_bottom")->setVisible(visible && !internal_show_group_notices_top_right());
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:Zi> Is done inside XUI now, using visibility_control
|
||||
|
||||
+253
-11
@@ -29,6 +29,8 @@
|
||||
#include "llcombobox.h"
|
||||
#include "lllineeditor.h"
|
||||
#include "lltexteditor.h"
|
||||
#include "llviewercontrol.h" // Needed for gSavedSettings
|
||||
#include "llnotificationsutil.h" // Needed for Notifications
|
||||
|
||||
#include "fsscrolllistctrl.h"
|
||||
|
||||
@@ -78,7 +80,8 @@ OmnifilterEngine::Needle* Omnifilter::getSelectedNeedle()
|
||||
if (needle_name_cell)
|
||||
{
|
||||
const std::string& needle_name = needle_name_cell->getValue().asString();
|
||||
if (!needle_name.empty())
|
||||
// Only try to access the needle if the name is not empty and it is on the current needle list, otherwise it will cause an error
|
||||
if (!needle_name.empty() && OmnifilterEngine::getInstance()->getNeedleList().contains(needle_name))
|
||||
{
|
||||
return &OmnifilterEngine::getInstance()->getNeedleList().at(needle_name);
|
||||
}
|
||||
@@ -217,7 +220,6 @@ void Omnifilter::onRemoveNeedleClicked()
|
||||
onSelectNeedle();
|
||||
}
|
||||
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
// Handles re-ordering the list of needle names when the UI is sorted.
|
||||
void Omnifilter::onSortChanged()
|
||||
{
|
||||
@@ -275,7 +277,236 @@ void Omnifilter::onDownNeedleClicked()
|
||||
mNeedleListCtrl->swapWithNext(current_index);
|
||||
}
|
||||
}
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
|
||||
// Callback method for the New Rule Set button when clicked.
|
||||
// Creates an notification to the user to ask for the name of the new rule set.
|
||||
void Omnifilter::onNewRuleSetClicked()
|
||||
{
|
||||
LLSD args;
|
||||
// Default name of the new rule set
|
||||
std::string new_rule_set_string = getString("OmnifilterNewRuleSet");
|
||||
args["RULESETNAME"] = new_rule_set_string;
|
||||
// Display the new rule set notification and if the user presses the OK button, call the new rule set name selected callback method
|
||||
LLNotificationsUtil::add("OmniFilterNewRuleSet", args, LLSD(),
|
||||
boost::bind(&Omnifilter::onNewRuleSetNameSelectedCallback, this, _1, _2));
|
||||
}
|
||||
|
||||
// Callback method for the Clone Rule Set button when clicked.
|
||||
// Creates an notification to the user to ask for the name of the clone rule set.
|
||||
void Omnifilter::onCloneRuleSetClicked()
|
||||
{
|
||||
LLSD args;
|
||||
// Default name of the cloned rule set
|
||||
std::string clone_rule_set_string = getString("OmnifilterCloneRuleSet");
|
||||
args["RULESETNAME"] = clone_rule_set_string;
|
||||
// Display the new rule set notification and if the user presses the OK button, call the new rule set name selected callback method
|
||||
LLNotificationsUtil::add("OmniFilterCloneRuleSet", args, LLSD(),
|
||||
boost::bind(&Omnifilter::onCloneRuleSetNameSelectedCallback, this, _1, _2));
|
||||
}
|
||||
|
||||
// Callback method for the Remove Rule Set button when clicked.
|
||||
// Creates a notification to the user to ask if they are sure they want to remove the specified Rule Set.
|
||||
void Omnifilter::onRemoveRuleSetClicked()
|
||||
{
|
||||
static OmnifilterEngine* instance = OmnifilterEngine::getInstance();
|
||||
// IF the user tries to remove the Default rule set, send an error as that is not allowed.
|
||||
if (mRuleSetsCmb->getCurrentIndex() == 0)
|
||||
{
|
||||
LLNotificationsUtil::add("OmniFilterRemoveRuleSetDefault", LLSD(), LLSD());
|
||||
}
|
||||
// Else prompt the user with a confirmation notification if they really want to remove the
|
||||
else
|
||||
{
|
||||
LLSD args;
|
||||
args["RULESETNAME"] = instance->getCurrentSelectedRuleSet();
|
||||
// Display the remove rule set notification and if the user presses the OK button, call the remove rule set confirm callback method
|
||||
LLNotificationsUtil::add("OmniFilterRemoveRuleSet", args, LLSD(),
|
||||
boost::bind(&Omnifilter::onRemoveRuleSetConfirmedCallback, this, _1, _2));
|
||||
}
|
||||
}
|
||||
|
||||
// New Rule Set callback, which does the actual cloning.
|
||||
void Omnifilter::onNewRuleSetNameSelectedCallback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
static OmnifilterEngine* instance = OmnifilterEngine::getInstance();
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (option == 0) // YES
|
||||
{
|
||||
std::string new_name = response["new_name"].asString();
|
||||
// Try to perform the actual creating a new rule set.
|
||||
S32 return_value = instance->addNewRuleSet(new_name);
|
||||
|
||||
if (return_value == 1)
|
||||
{
|
||||
S32 new_rule_index = gSavedSettings.getS32("OmnifilterRuleSetID");
|
||||
// Add the new rule set to the Rule Set Drop Down
|
||||
mRuleSetsCmb->add(new_name, LLSD(new_rule_index));
|
||||
// Select the new rule set
|
||||
mRuleSetsCmb->setCurrentByIndex(new_rule_index);
|
||||
|
||||
// Clear the Rule list
|
||||
mNeedleListCtrl->clear();
|
||||
mNeedleListCtrl->clearRows();
|
||||
|
||||
// Add the new item.
|
||||
onAddNeedleClicked();
|
||||
|
||||
// Save the state of the OmniFilter Window
|
||||
instance->setDirty(true);
|
||||
}
|
||||
// Else the user tried to create a new rule set with a blank name, so show an error.
|
||||
else if (return_value == -1)
|
||||
{
|
||||
LLNotificationsUtil::add("OmniFilterrNewRuleSetBlank", LLSD(), LLSD(), boost::bind(&Omnifilter::onNewRuleSetClicked, this));
|
||||
}
|
||||
// Else the user tried to create a new rule set with a duplicate name, so show an error.
|
||||
else if (return_value == 0)
|
||||
{
|
||||
LLNotificationsUtil::add("OmniFilterNewRuleSetDuplicate", LLSD(), LLSD(), boost::bind(&Omnifilter::onNewRuleSetClicked, this));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Clone Rule Set callback, which does the actual cloning.
|
||||
void Omnifilter::onCloneRuleSetNameSelectedCallback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
static OmnifilterEngine* instance = OmnifilterEngine::getInstance();
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (option == 0) // YES
|
||||
{
|
||||
std::string new_name = response["new_name"].asString();
|
||||
// Try to perform the actual cloning of the rule set.
|
||||
S32 return_value = instance->addClonedRuleSet(new_name);
|
||||
// If the cloning succeeded
|
||||
if (return_value == 1)
|
||||
{
|
||||
// Get the index of the added rule set.
|
||||
S32 new_rule_index = gSavedSettings.getS32("OmnifilterRuleSetID");
|
||||
// Add the new rule set to the Rule Set Drop Down
|
||||
mRuleSetsCmb->add(new_name, LLSD(new_rule_index));
|
||||
|
||||
// Select the new rule set
|
||||
mRuleSetsCmb->setCurrentByIndex(new_rule_index);
|
||||
|
||||
// Save the state of the OmniFilter Window
|
||||
instance->setDirty(true);
|
||||
}
|
||||
// Else the user tried to create a cloned rule set with a blank name, so show an error.
|
||||
else if (return_value == -1)
|
||||
{
|
||||
LLNotificationsUtil::add("OmniFilterCloneRuleSetBlank", LLSD(), LLSD(), boost::bind(&Omnifilter::onCloneRuleSetClicked, this));
|
||||
}
|
||||
// Else the user tried to create a cloned rule set with a duplicate name, so show an error.
|
||||
else if (return_value == 0)
|
||||
{
|
||||
LLNotificationsUtil::add("OmniFilterCloneRuleSetDuplicate", LLSD(), LLSD(), boost::bind(&Omnifilter::onCloneRuleSetClicked, this));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove Rule Set callback, which does the actual removal.
|
||||
void Omnifilter::onRemoveRuleSetConfirmedCallback(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
static OmnifilterEngine* instance = OmnifilterEngine::getInstance();
|
||||
// Get the user response
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (option == 0) // YES
|
||||
{
|
||||
std::string tooltip_msg;
|
||||
// Get the index of the current rule set being removed.
|
||||
S32 current_index = gSavedSettings.getS32("OmnifilterRuleSetID");
|
||||
// Try to perform the actual removal.
|
||||
S32 return_value = instance->removeCurrentRuleSet();
|
||||
// If the removal succeeded
|
||||
if (return_value == 1)
|
||||
{
|
||||
// Remove the rule set from the Rule Set Drop Down
|
||||
mRuleSetsCmb->remove(current_index);
|
||||
// Reload the current rule set and switch the UI over to the Default rule set.
|
||||
reloadRule();
|
||||
mRuleSetsCmb->setCurrentByIndex(0);
|
||||
|
||||
// Save the state of the OmniFilter Window
|
||||
instance->setDirty(true);
|
||||
}
|
||||
// Else the user tried to remove the default rule set, so show an error.
|
||||
else if (return_value == 0)
|
||||
{
|
||||
LLNotificationsUtil::add("OmniFilterRemoveRuleSetDefault", LLSD(), LLSD());
|
||||
}
|
||||
// Else the user tried to remove a rule set that index was out of bounds, so show an error.
|
||||
else if (return_value == -1)
|
||||
{
|
||||
LLSD args;
|
||||
args["OUTOFBOUNDS"] = current_index;
|
||||
LLNotificationsUtil::add("OmniFilterRemoveRuleSetOutofBounds", args, LLSD());
|
||||
}
|
||||
// Else the user tried to remove a rule set that had an name that does not exist in the map of rule sets, so show an error.
|
||||
else if (return_value == -2)
|
||||
{
|
||||
LLSD args;
|
||||
args["INVALIDNAME"] = instance->getCurrentSelectedRuleSet();
|
||||
LLNotificationsUtil::add("OmniFilterRemoveRuleSetInvalidName", args, LLSD());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rule Set Drop Down on commit callback method
|
||||
void Omnifilter::onRuleSetChanged()
|
||||
{
|
||||
static OmnifilterEngine* instance = OmnifilterEngine::getInstance();
|
||||
|
||||
// Save the current
|
||||
// Write the current rule set back to the storeage
|
||||
instance->assignRuleSet(false);
|
||||
// Store the current combo box index as the Needle Preset Index
|
||||
gSavedSettings.setS32("OmnifilterRuleSetID", mRuleSetsCmb->getCurrentIndex());
|
||||
// Assign and reload the current rule
|
||||
instance->assignRuleSetNameFromSettings();
|
||||
|
||||
instance->assignRuleSet(true);
|
||||
reloadRule();
|
||||
}
|
||||
|
||||
// Reloads the full rule sets drop down widget (combobox)
|
||||
void Omnifilter::reloadRules()
|
||||
{
|
||||
static OmnifilterEngine* instance = OmnifilterEngine::getInstance();
|
||||
// Clear the current needles
|
||||
mRuleSetsCmb->clear();
|
||||
S32 current_rule_set_id = gSavedSettings.getS32("OmnifilterRuleSetID");
|
||||
for (S32 index = 0; index < instance->getOrderedRuleSetSize(); index++)
|
||||
{
|
||||
// Get the name from the ordered list of rule sets.
|
||||
const std::string needle_rule_set_name(instance->getOrderedRuleSetName(index));
|
||||
LLSD value(index);
|
||||
// And add to the UI element. The value is the value that is passed along with the commit callback method.
|
||||
mRuleSetsCmb->add(needle_rule_set_name, value);
|
||||
}
|
||||
// Finally, select the stored rule set
|
||||
mRuleSetsCmb->selectByValue(LLSD(current_rule_set_id));
|
||||
}
|
||||
|
||||
// Reloads the actual rule set UI elements, including the Rule scroll list and editor panel
|
||||
void Omnifilter::reloadRule()
|
||||
{
|
||||
// Use static pointer for the instance so that don't have to keep requesting every time this code is touched.
|
||||
static OmnifilterEngine* instance = OmnifilterEngine::getInstance();
|
||||
// Clear the current needles
|
||||
mNeedleListCtrl->clearRows();
|
||||
mNeedleListCtrl->clear();
|
||||
|
||||
// Loop over the ordered list
|
||||
for (const auto& needle_name : instance->getOrderedNeedleList())
|
||||
{
|
||||
// Get the current needle and use the addNeedle method to add the the UI.
|
||||
const auto& needle = instance->getNeedleList()[needle_name];
|
||||
addNeedle(needle_name, needle);
|
||||
}
|
||||
|
||||
mNeedleListCtrl->selectFirstItem();
|
||||
onSelectNeedle();
|
||||
}
|
||||
|
||||
void Omnifilter::onNeedleNameChanged()
|
||||
{
|
||||
@@ -369,11 +600,9 @@ bool Omnifilter::postBuild()
|
||||
mNeedleListCtrl = getChild<FSScrollListCtrl>("needle_list");
|
||||
mAddNeedleBtn = getChild<LLButton>("add_needle");
|
||||
mRemoveNeedleBtn = getChild<LLButton>("remove_needle");
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
// Add the up and down buttons for re-aranging the order of the needles
|
||||
mUpNeedleBtn = getChild<LLButton>("up_needle");
|
||||
mDownNeedleBtn = getChild<LLButton>("down_needle");
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
mFilterLogCtrl = getChild<FSScrollListCtrl>("filter_log");
|
||||
mPanelDetails = getChild<LLPanel>("panel_details");
|
||||
mNeedleNameCtrl = getChild<LLLineEditor>("needle_name");
|
||||
@@ -381,6 +610,11 @@ bool Omnifilter::postBuild()
|
||||
mSenderCaseSensitiveCheck = getChild<LLCheckBoxCtrl>("sender_case");
|
||||
mSenderMatchTypeCombo = getChild<LLComboBox>("sender_match_type");
|
||||
mContentCtrl = getChild<LLTextEditor>("content");
|
||||
// Add the preset controls
|
||||
mRuleSetsCmb = getChild<LLComboBox>("cmb_rule_sets"); // Rule Set Drop Down
|
||||
mNewRuleSetBtn = getChild<LLButton>("btn_rule_set_new"); // New Rule Set
|
||||
mCloneRuleSetBtn = getChild<LLButton>("btn_rule_set_clone"); // Clone Rule Set
|
||||
mRemoveRuleSetBtn = getChild<LLButton>("btn_rule_set_remove"); // Remove Rule Set
|
||||
mContentCaseSensitiveCheck = getChild<LLCheckBoxCtrl>("content_case");
|
||||
mContentMatchTypeCombo = getChild<LLComboBox>("content_match_type");
|
||||
mRegionNameCtrl = getChild<LLLineEditor>("region_name");
|
||||
@@ -412,13 +646,16 @@ bool Omnifilter::postBuild()
|
||||
mFilterLogCtrl->deleteAllItems();
|
||||
|
||||
auto& instance = OmnifilterEngine::instance();
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
//for (const auto& [needle_name, needle] : instance.getNeedleList())
|
||||
// Loop over the ordered list
|
||||
|
||||
// Reload the rules set UI elements, uses the settings stored rule set ID
|
||||
reloadRules();
|
||||
instance.assignRuleSetNameFromSettings();
|
||||
instance.assignRuleSet(true);
|
||||
|
||||
// Loop over the ordered list
|
||||
for (const auto& needle_name : instance.getOrderedNeedleList())
|
||||
{
|
||||
const auto& needle = instance.getNeedleList()[needle_name];
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
addNeedle(needle_name, needle);
|
||||
}
|
||||
|
||||
@@ -440,12 +677,17 @@ bool Omnifilter::postBuild()
|
||||
mNeedleListCtrl->setCommitCallback(boost::bind(&Omnifilter::onSelectNeedle, this));
|
||||
mAddNeedleBtn->setCommitCallback(boost::bind(&Omnifilter::onAddNeedleClicked, this));
|
||||
mRemoveNeedleBtn->setCommitCallback(boost::bind(&Omnifilter::onRemoveNeedleClicked, this));
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
|
||||
// Add the callbacks for the up and down buttons to re-order the filter list
|
||||
mNeedleListCtrl->setSortChangedCallback(boost::bind(&Omnifilter::onSortChanged, this));
|
||||
mUpNeedleBtn->setCommitCallback(boost::bind(&Omnifilter::onUpNeedleClicked, this));
|
||||
mDownNeedleBtn->setCommitCallback(boost::bind(&Omnifilter::onDownNeedleClicked, this));
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
// Add the Rule Set controls
|
||||
mRuleSetsCmb->setCommitCallback(boost::bind(&Omnifilter::onRuleSetChanged, this)); // Rule Set Drop Down
|
||||
mNewRuleSetBtn->setCommitCallback(boost::bind(&Omnifilter::onNewRuleSetClicked, this)); // New Rule Set
|
||||
mCloneRuleSetBtn->setCommitCallback(boost::bind(&Omnifilter::onCloneRuleSetClicked, this)); // Clone Rule Set
|
||||
mRemoveRuleSetBtn->setCommitCallback(boost::bind(&Omnifilter::onRemoveRuleSetClicked, this)); // Remove Rule Set
|
||||
|
||||
mNeedleNameCtrl->setCommitCallback(boost::bind(&Omnifilter::onNeedleNameChanged, this));
|
||||
mSenderNameCtrl->setCommitCallback(boost::bind(&Omnifilter::onNeedleChanged, this));
|
||||
mSenderCaseSensitiveCheck->setCommitCallback(boost::bind(&Omnifilter::onNeedleChanged, this));
|
||||
|
||||
@@ -55,11 +55,18 @@ protected:
|
||||
void onNeedleChanged();
|
||||
void onAddNeedleClicked();
|
||||
void onRemoveNeedleClicked();
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
void onSortChanged();
|
||||
void onUpNeedleClicked();
|
||||
void onDownNeedleClicked();
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
void onNewRuleSetClicked();
|
||||
void onCloneRuleSetClicked();
|
||||
void onRemoveRuleSetClicked();
|
||||
void onNewRuleSetNameSelectedCallback(const LLSD& notification, const LLSD& response);
|
||||
void onCloneRuleSetNameSelectedCallback(const LLSD& notification, const LLSD& response);
|
||||
void onRemoveRuleSetConfirmedCallback(const LLSD& notification, const LLSD& response);
|
||||
void onRuleSetChanged();
|
||||
void reloadRules();
|
||||
void reloadRule();
|
||||
void onNeedleNameChanged();
|
||||
void onNeedleCheckboxChanged(LLUICtrl* ctrl);
|
||||
void onOwnerChanged();
|
||||
@@ -69,10 +76,12 @@ protected:
|
||||
FSScrollListCtrl* mNeedleListCtrl{ nullptr };
|
||||
LLButton* mAddNeedleBtn{ nullptr };
|
||||
LLButton* mRemoveNeedleBtn{ nullptr };
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
LLButton* mUpNeedleBtn{ nullptr };
|
||||
LLButton* mDownNeedleBtn{ nullptr };
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
LLComboBox* mRuleSetsCmb{ nullptr };
|
||||
LLButton* mNewRuleSetBtn{ nullptr };
|
||||
LLButton* mCloneRuleSetBtn{ nullptr };
|
||||
LLButton* mRemoveRuleSetBtn{ nullptr };
|
||||
FSScrollListCtrl* mFilterLogCtrl{ nullptr };
|
||||
LLPanel* mPanelDetails{ nullptr };
|
||||
LLLineEditor* mNeedleNameCtrl{ nullptr };
|
||||
|
||||
@@ -38,13 +38,16 @@ OmnifilterEngine::OmnifilterEngine()
|
||||
: LLSingleton<OmnifilterEngine>()
|
||||
, LLEventTimer(5.0f)
|
||||
, mDirty(false)
|
||||
, mCurrentSelectedRuleSet("Default")
|
||||
{
|
||||
mEventTimer.stop();
|
||||
}
|
||||
|
||||
OmnifilterEngine::~OmnifilterEngine()
|
||||
{
|
||||
// delete Xxx;
|
||||
// If the user changed a setting and quickly closed the viewer, the changes would not be saved, but
|
||||
// the changes to the settings.xml would, which would cause issues. So save upon close just in case.
|
||||
saveNeedles();
|
||||
}
|
||||
|
||||
void OmnifilterEngine::init()
|
||||
@@ -134,13 +137,10 @@ bool OmnifilterEngine::matchStrings(std::string_view needle_string, std::string_
|
||||
|
||||
const OmnifilterEngine::Needle* OmnifilterEngine::match(const Haystack& haystack)
|
||||
{
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
// Use ordered needle list to get the names of the needles in specified order and not the order added to the map.
|
||||
for (const auto& needle_name : mOrderedNeedles)
|
||||
//for (const auto& [needle_name, needle]: mNeedles)
|
||||
{
|
||||
const auto& needle = mNeedles[needle_name];
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
if (!needle.mEnabled)
|
||||
{
|
||||
continue;
|
||||
@@ -198,10 +198,9 @@ OmnifilterEngine::Needle& OmnifilterEngine::newNeedle(const std::string& needle_
|
||||
mNeedles[needle_name] = new_needle;
|
||||
}
|
||||
setDirty(true);
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
// Add to the ordered needle vector the name of the new needle
|
||||
mOrderedNeedles.push_back(needle_name);
|
||||
// <F/S:minerjr> [FIRE-36649]
|
||||
|
||||
return mNeedles[needle_name];
|
||||
}
|
||||
|
||||
@@ -211,26 +210,24 @@ void OmnifilterEngine::renameNeedle(const std::string& old_name, const std::stri
|
||||
auto node_handler = mNeedles.extract(old_name);
|
||||
node_handler.key() = new_name;
|
||||
mNeedles.insert(std::move(node_handler));
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
|
||||
// Find the index of the given old name
|
||||
S32 found_index = getOrderedNeedleIndex(old_name);
|
||||
// If the name was found (-1 when not found), set the ordered needle vector at the found index to the new value
|
||||
if (found_index >= 0)
|
||||
mOrderedNeedles[found_index] = new_name;
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
|
||||
setDirty(true);
|
||||
}
|
||||
|
||||
void OmnifilterEngine::deleteNeedle(const std::string& needle_name)
|
||||
{
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
// Find the index of the given needle name
|
||||
S32 found_index = getOrderedNeedleIndex(needle_name);
|
||||
// If the name was found (-1 when not found), erase the need based upon the offset
|
||||
if (found_index >= 0)
|
||||
mOrderedNeedles.erase(mOrderedNeedles.begin() + found_index);
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
|
||||
mNeedles.erase(needle_name);
|
||||
setDirty(true);
|
||||
}
|
||||
@@ -240,7 +237,6 @@ OmnifilterEngine::needle_list_t& OmnifilterEngine::getNeedleList()
|
||||
return mNeedles;
|
||||
}
|
||||
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
// Get the name from the vector of ordered needles at the specified index
|
||||
std::string_view OmnifilterEngine::getOrderedNeedleName(const S32 index) const
|
||||
{
|
||||
@@ -309,7 +305,6 @@ bool OmnifilterEngine::swapNeedles(S32 index1, S32 index2)
|
||||
|
||||
return true;
|
||||
}
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
|
||||
void OmnifilterEngine::setDirty(bool dirty)
|
||||
{
|
||||
@@ -325,6 +320,359 @@ void OmnifilterEngine::setDirty(bool dirty)
|
||||
}
|
||||
}
|
||||
|
||||
// Get the name from the vector of ordered rule sets at the specified index
|
||||
std::string_view OmnifilterEngine::getOrderedRuleSetName(const S32 index) const
|
||||
{
|
||||
// If the index is within the range of the vector, return the stored value
|
||||
if (index >= 0 && index < mOrderedRuleSets.size() && mOrderedRuleSets.size() > 0)
|
||||
{
|
||||
return mOrderedRuleSets[index];
|
||||
}
|
||||
|
||||
// Return an empty string if not found.
|
||||
return "";
|
||||
}
|
||||
|
||||
// Gets the ordered rule set index by looking up the name of a rule set.
|
||||
S32 OmnifilterEngine::getOrderedRuleSetIndex(std::string_view lookup_name)
|
||||
{
|
||||
for (S32 index = 0; index < mOrderedNeedles.size(); index++)
|
||||
{
|
||||
if (mOrderedNeedles[index] == lookup_name)
|
||||
{
|
||||
return index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Parses a passed in LLSD as a Map of rule sets, which contain another map, which contains the actual rule set data and an order value
|
||||
// return false if the current LLSD is an older format, return true when finish importing the data.
|
||||
bool OmnifilterEngine::importFromLLSD(const LLSD& needle_rule_sets_llsd)
|
||||
{
|
||||
std::string preset_name = "Default";
|
||||
// If there is no default Rule Set return false
|
||||
if (!needle_rule_sets_llsd.has("Default"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// Else there is a map named default, does it contain a variable of "order", if not, return false
|
||||
else if (!needle_rule_sets_llsd["Default"].has("order"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
mOrderedRuleSets.clear();
|
||||
// Use the number of rule sets to pre-allocate the ordered rule sets. So can use assignment operators without re-allocating.
|
||||
mOrderedRuleSets.resize(needle_rule_sets_llsd.size());
|
||||
// Loop over the outer Rule Set map
|
||||
S32 rule_set_index = 0;
|
||||
for (const auto&[new_rule_set_name, new_rule_set_llsd] : llsd::inMap(needle_rule_sets_llsd))
|
||||
{
|
||||
|
||||
// If there is an order tag, then
|
||||
if (new_rule_set_llsd.has("order"))
|
||||
{
|
||||
// Add the rule set name to the ordered list at the order position.
|
||||
mOrderedRuleSets[new_rule_set_llsd["order"].asInteger()] = new_rule_set_name;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Else if there is no order tag, then add add the rule set name to the ordered list in the order read in.
|
||||
// NOTE maps don't store data order added, but optimized order for storage.
|
||||
mOrderedRuleSets[rule_set_index++] = new_rule_set_name;
|
||||
}
|
||||
// Generate a new rule set
|
||||
rule_set_t new_rule_set = rule_set_t(needle_ordered_list_t(), needle_list_t());
|
||||
// Apply the size of the rule set (number of rules) to the ordered rule set set.
|
||||
// First = Ordered Rule Set Vector, Second = Actual Rule Set Map
|
||||
new_rule_set.first.resize(new_rule_set_llsd["rule_set"].size());
|
||||
// Set the current needles_llsd to the actual rule set stored.
|
||||
// keeps old code valid.
|
||||
LLSD needles_llsd = new_rule_set_llsd["rule_set"];
|
||||
S32 index = 0;
|
||||
// Now loop over the rule map stored in the rule set.
|
||||
for (const auto& [new_needle_name, needle_data] : llsd::inMap(needles_llsd))
|
||||
{
|
||||
Needle new_needle;
|
||||
// Perform checks on all input values from the data format and skip any that don't exist.
|
||||
if (needle_data.has("sender_name"))
|
||||
new_needle.mSenderName = needle_data["sender_name"].asString();
|
||||
if (needle_data.has("content"))
|
||||
new_needle.mContent = needle_data["content"].asString();
|
||||
if (needle_data.has("region_name"))
|
||||
new_needle.mRegionName = needle_data["region_name"].asString();
|
||||
if (needle_data.has("chat_replace"))
|
||||
new_needle.mChatReplace = needle_data["chat_replace"].asString();
|
||||
if (needle_data.has("button_reply"))
|
||||
new_needle.mButtonReply = needle_data["button_reply"].asString();
|
||||
if (needle_data.has("textbox_reply"))
|
||||
new_needle.mTextBoxReply = needle_data["textbox_reply"].asString();
|
||||
if (needle_data.has("sender_name_match_type"))
|
||||
new_needle.mSenderNameMatchType = static_cast<OmnifilterEngine::eMatchType>(needle_data["sender_name_match_type"].asInteger());
|
||||
if (needle_data.has("content_match_type"))
|
||||
new_needle.mContentMatchType = static_cast<OmnifilterEngine::eMatchType>(needle_data["content_match_type"].asInteger());
|
||||
|
||||
if (needle_data.has("types"))
|
||||
{
|
||||
LLSD types_llsd = needle_data["types"];
|
||||
|
||||
for (const auto& needle_type : llsd::inArray(types_llsd))
|
||||
{
|
||||
new_needle.mTypes.insert(static_cast<OmnifilterEngine::eType>(needle_type.asInteger()));
|
||||
}
|
||||
}
|
||||
if (needle_data.has("enabled"))
|
||||
new_needle.mEnabled = needle_data["enabled"].asBoolean();
|
||||
if (needle_data.has("sender_name_case_insensitive"))
|
||||
new_needle.mSenderNameCaseInsensitive = needle_data["sender_name_case_insensitive"].asBoolean();
|
||||
if (needle_data.has("content_case_insensitive"))
|
||||
new_needle.mContentCaseInsensitive = needle_data["content_case_insensitive"].asBoolean();
|
||||
|
||||
if (needle_data.has("enabled"))
|
||||
{
|
||||
const std::string owner_id_str = needle_data["owner_id"].asString();
|
||||
if (!owner_id_str.empty())
|
||||
{
|
||||
new_needle.mOwnerID.set(owner_id_str);
|
||||
}
|
||||
}
|
||||
// Assign the actuall new rule set to the parsed needle object
|
||||
new_rule_set.second[new_needle_name] = new_needle;
|
||||
// Add the loaded needle name to the ordered needle list
|
||||
// Needles are stored in order added to the map originally so use the
|
||||
// order value stored to restore the order back to the user
|
||||
// defined order.
|
||||
if (needle_data.has("order"))
|
||||
{
|
||||
new_rule_set.first[needle_data["order"].asInteger()] = new_needle_name;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_rule_set.first[index++] = new_needle_name;
|
||||
}
|
||||
}
|
||||
mNeedleRuleSets[new_rule_set_name] = new_rule_set;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Exports the current stored orered rules sets to an LLSD object and returns the object created.
|
||||
LLSD OmnifilterEngine::exportToLLSD()
|
||||
{
|
||||
LLSD output;
|
||||
// Loop over all the rulesets
|
||||
S32 rule_set_order = 0;
|
||||
// Loop over the ordered rule set names
|
||||
for (const auto& export_rule_set_name : mOrderedRuleSets)
|
||||
{
|
||||
LLSD needles_llsd;
|
||||
// Get the map of needles that have the name of the current ordered rule set
|
||||
const auto& export_rule_set = mNeedleRuleSets[export_rule_set_name];
|
||||
|
||||
// Use ordered needle list to get the names of the needles in specified order and not the order added to the map.
|
||||
S32 order = 0;
|
||||
for (const auto& needle_name : export_rule_set.first)
|
||||
{
|
||||
const Needle &needle = export_rule_set.second.at(needle_name);
|
||||
// Store the order of the needle
|
||||
needles_llsd[needle_name]["order"] = order++;
|
||||
|
||||
needles_llsd[needle_name]["sender_name"] = needle.mSenderName;
|
||||
needles_llsd[needle_name]["content"] = needle.mContent;
|
||||
needles_llsd[needle_name]["region_name"] = needle.mRegionName;
|
||||
needles_llsd[needle_name]["chat_replace"] = needle.mChatReplace;
|
||||
needles_llsd[needle_name]["button_reply"] = needle.mButtonReply;
|
||||
needles_llsd[needle_name]["textbox_reply"] = needle.mTextBoxReply;
|
||||
needles_llsd[needle_name]["sender_name_match_type"] = needle.mSenderNameMatchType;
|
||||
needles_llsd[needle_name]["content_match_type"] = needle.mContentMatchType;
|
||||
needles_llsd[needle_name]["owner_id"] = needle.mOwnerID;
|
||||
|
||||
LLSD types_llsd;
|
||||
for (auto type : needle.mTypes)
|
||||
{
|
||||
types_llsd.append(static_cast<S32>(type));
|
||||
}
|
||||
|
||||
needles_llsd[needle_name]["types"] = types_llsd;
|
||||
needles_llsd[needle_name]["enabled"] = needle.mEnabled;
|
||||
needles_llsd[needle_name]["sender_name_case_insensitive"] = needle.mSenderNameCaseInsensitive;
|
||||
needles_llsd[needle_name]["content_case_insensitive"] = needle.mContentCaseInsensitive;
|
||||
}
|
||||
// Store the rule set into the otuput with the rule set store in the LLSD as well as the rule set order value
|
||||
output[export_rule_set_name]["rule_set"] = needles_llsd;
|
||||
output[export_rule_set_name]["order"] = rule_set_order++;
|
||||
}
|
||||
|
||||
// Return the final LLSD which contains all the Rule Sets
|
||||
return output;
|
||||
}
|
||||
|
||||
// Assignes a rule set to either fron the internal variable to the stored map of rule sets, or
|
||||
// copies the current selected rule set from storage to the internal variables.
|
||||
// This lets us keep all the original design and not require refactoring of code
|
||||
// in other classes that interact with the Omnifilter.
|
||||
bool OmnifilterEngine::assignRuleSet(const bool rule_set_to_internal)
|
||||
{
|
||||
// If there is no current selected rule set or the rule set name is not in the list of rule sets, return false
|
||||
if (mCurrentSelectedRuleSet.empty() || !mNeedleRuleSets.contains(mCurrentSelectedRuleSet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// If transfering data from the currently selected rule set to the internal variables
|
||||
if (rule_set_to_internal)
|
||||
{
|
||||
// Assign the needle map and vector of ordered neele names from the currently selected rule set.
|
||||
mNeedles = mNeedleRuleSets[mCurrentSelectedRuleSet].second;
|
||||
mOrderedNeedles = mNeedleRuleSets[mCurrentSelectedRuleSet].first;
|
||||
}
|
||||
// Else, want to move the data back the from the internal variables to selected data values
|
||||
else
|
||||
{
|
||||
mNeedleRuleSets[mCurrentSelectedRuleSet].second = mNeedles;
|
||||
mNeedleRuleSets[mCurrentSelectedRuleSet].first = mOrderedNeedles;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Assigns the current selected rule set string to the value passed in
|
||||
bool OmnifilterEngine::setCurrentRuleSet(std::string_view rule_set_name)
|
||||
{
|
||||
// If blank, return false as we should not have a blank name.
|
||||
if (rule_set_name.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
// Store the pass in rule set name.
|
||||
mCurrentSelectedRuleSet = rule_set_name;
|
||||
|
||||
// Apply the rule set to the current variables
|
||||
assignRuleSet();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Performs the actual removal of the current rule set.
|
||||
S32 OmnifilterEngine::removeCurrentRuleSet()
|
||||
{
|
||||
// If the current rule set list contains the currently selceted rule set, then erase it.
|
||||
if (mNeedleRuleSets.contains(mCurrentSelectedRuleSet))
|
||||
{
|
||||
S32 current_index = gSavedSettings.getS32("OmnifilterRuleSetID");
|
||||
// If the current index is greater then the
|
||||
if (current_index == 0)
|
||||
{
|
||||
// Return 0 for unable to remove default
|
||||
return 0;
|
||||
}
|
||||
|
||||
// If the index is within range of the needle rule sets, then
|
||||
if (current_index < mNeedleRuleSets.size() && current_index > 0)
|
||||
{
|
||||
// Erase both the the current rule set and the ordered rule set name
|
||||
mNeedleRuleSets.erase(mCurrentSelectedRuleSet);
|
||||
mOrderedRuleSets.erase(mOrderedRuleSets.begin() + current_index);
|
||||
// Reset the selected rule set ID back to 0, let the user pick the one to use next. 0 is also safe as it should never be removed.
|
||||
gSavedSettings.setS32("OmnifilterRuleSetID", 0);
|
||||
// Re-assign the current rule set name and reload the rule set from storage to the rule set
|
||||
assignRuleSetNameFromSettings();
|
||||
assignRuleSet();
|
||||
// Return 1 indicating that the removal worked correctly.
|
||||
return 1;
|
||||
}
|
||||
// Return -1 as the rule set index out of bounds
|
||||
return 0;
|
||||
}
|
||||
// Return -2 for rule set name does not exist
|
||||
return -2;
|
||||
}
|
||||
|
||||
// Add a new rule set based upon the name passed in
|
||||
S32 OmnifilterEngine::addNewRuleSet(std::string_view new_name)
|
||||
{
|
||||
// If the name is blank, return an error code, to then let the user know with a notification
|
||||
if (new_name.empty())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string str_new_name(new_name);
|
||||
// If the name already exists, return an error to let the user know
|
||||
if (mNeedleRuleSets.contains(str_new_name))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// We want to clear the current rule set and ordered rules as a new rule set has only a single template rule that is disabled.
|
||||
mNeedles.clear();
|
||||
mOrderedNeedles.clear();
|
||||
// Set the rule set in the map to a new rule set pair.
|
||||
mNeedleRuleSets[str_new_name] = rule_set_t(needle_ordered_list_t(), needle_list_t());
|
||||
// Update the OmnifilterRuleSetID saved setting to store the location of the new rule set.
|
||||
// We want to do this to support auto-selecting the new rule set.
|
||||
gSavedSettings.setS32("OmnifilterRuleSetID", static_cast<S32>(mNeedleRuleSets.size() - 1));
|
||||
// Set the current selcted rule set to the new rule set
|
||||
mCurrentSelectedRuleSet = str_new_name;
|
||||
// Add the rule set name to the list of ordered rule sets
|
||||
mOrderedRuleSets.push_back(mCurrentSelectedRuleSet);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Clone the current rule set based upon the name passed in
|
||||
S32 OmnifilterEngine::addClonedRuleSet(std::string_view new_name)
|
||||
{
|
||||
// If the name is blank, return an error code, to then let the user know with a notification
|
||||
if (new_name.empty())
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string str_new_name(new_name);
|
||||
|
||||
// If the name already exists, return an error to let the user know
|
||||
if (mNeedleRuleSets.contains(str_new_name))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// This method is different in the new rule set method by not clearing the current rules and ordered rules.
|
||||
|
||||
// Set the rule set in the map to a new rule set pair.
|
||||
mNeedleRuleSets[str_new_name] = rule_set_t(needle_ordered_list_t(), needle_list_t());
|
||||
// Update the OmnifilterRuleSetID saved setting to store the location of the new rule set.
|
||||
// We want to do this to support auto-selecting the new rule set.
|
||||
gSavedSettings.setS32("OmnifilterRuleSetID", static_cast<S32>(mNeedleRuleSets.size() - 1));
|
||||
// Set the current selcted rule set to the new rule set
|
||||
mCurrentSelectedRuleSet = str_new_name;
|
||||
// Add the rule set name to the list of ordered rule sets
|
||||
mOrderedRuleSets.push_back(mCurrentSelectedRuleSet);
|
||||
|
||||
// Copy the internal rule set to the stored rulset
|
||||
assignRuleSet(false);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Takes the stored setting OmnifilterRuleSetID and assigns the current
|
||||
// selected rule set to the ordered rule set at that location.
|
||||
bool OmnifilterEngine::assignRuleSetNameFromSettings()
|
||||
{
|
||||
// Get hte number of items to loop over
|
||||
S32 rule_set_id = gSavedSettings.getS32("OmnifilterRuleSetID");
|
||||
std::string found_rule_set(getOrderedRuleSetName(rule_set_id));
|
||||
|
||||
if (found_rule_set.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mCurrentSelectedRuleSet = found_rule_set;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void OmnifilterEngine::loadNeedles()
|
||||
{
|
||||
if (mNeedlesXMLPath.empty())
|
||||
@@ -391,13 +739,33 @@ void OmnifilterEngine::loadNeedles()
|
||||
return;
|
||||
}
|
||||
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
static LLCachedControl<S32> NeedlePresetIndex(gSavedSettings, "OmnifilterRuleSetID");
|
||||
|
||||
// If this is not the first time loading, based upon the preset index being set
|
||||
// to an invalid valid, after this there should always be atleast 1 rule set (default)
|
||||
if (NeedlePresetIndex > -1)
|
||||
{
|
||||
mNeedleRuleSets.clear();
|
||||
// If the importing works out correctly, then use the reloaded rulset set name from the settings and assign that rule set.
|
||||
if (importFromLLSD(needles_llsd))
|
||||
{
|
||||
assignRuleSetNameFromSettings();
|
||||
// Assign the rule set
|
||||
assignRuleSet();
|
||||
// Return as we can skip the rest of the old loading.
|
||||
return;
|
||||
}
|
||||
// Otherwise, the import failed as it may be an existing older rule set that has a vector of ordered rules.
|
||||
// If so, we still want to use the older load code to parse the older form and convert to the newer format.
|
||||
}
|
||||
// Load the file with the old code to get the old .xml file data loaded, to then be outputted in the new format
|
||||
|
||||
// Clear the vector of filters
|
||||
mOrderedNeedles.clear();
|
||||
// Pre-allocate space for the list of needle names, so we can use an index into it for assignments down below
|
||||
mOrderedNeedles.resize(needles_llsd.size());
|
||||
S32 index = 0;
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
|
||||
for (const auto& [new_needle_name, needle_data] : llsd::inMap(needles_llsd))
|
||||
{
|
||||
Needle new_needle;
|
||||
@@ -428,7 +796,7 @@ void OmnifilterEngine::loadNeedles()
|
||||
}
|
||||
|
||||
mNeedles[new_needle_name] = new_needle;
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
|
||||
// Add the loaded needle name to the ordered needle list
|
||||
// Needles are stored in order added to the map originally so use the
|
||||
// order value stored to restore the order back to the user
|
||||
@@ -442,8 +810,19 @@ void OmnifilterEngine::loadNeedles()
|
||||
|
||||
mOrderedNeedles[index++] = new_needle_name;
|
||||
}
|
||||
// <FS:minerjr> [/FIRE-36649]
|
||||
}
|
||||
|
||||
// Create a default from the current version
|
||||
gSavedSettings.setS32("OmnifilterRuleSetID", 0);
|
||||
// The first rule set is always called Default.
|
||||
mCurrentSelectedRuleSet = "Default";
|
||||
// Create a new rule set with the already parsed ordered ruules and map of rules.
|
||||
mNeedleRuleSets["Default"] = rule_set_t(mOrderedNeedles, mNeedles);
|
||||
mOrderedRuleSets.push_back(mCurrentSelectedRuleSet);
|
||||
// Save the ruleset to the storage rule set.
|
||||
assignRuleSet(false);
|
||||
// Save the changes back to the Omnifilter.xml file.
|
||||
saveNeedles();
|
||||
}
|
||||
|
||||
void OmnifilterEngine::saveNeedles()
|
||||
@@ -469,37 +848,10 @@ void OmnifilterEngine::saveNeedles()
|
||||
|
||||
LLSD needles_llsd;
|
||||
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
// Use ordered needle list to get the names of the needles in specified order and not the order added to the map.
|
||||
//for (const auto& [needle_name, needle] : mNeedles)
|
||||
S32 order = 0;
|
||||
for (const auto& needle_name : mOrderedNeedles)
|
||||
{
|
||||
const auto& needle = mNeedles[needle_name];
|
||||
// Store the order of the needle
|
||||
needles_llsd[needle_name]["order"] = order++;
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
needles_llsd[needle_name]["sender_name"] = needle.mSenderName;
|
||||
needles_llsd[needle_name]["content"] = needle.mContent;
|
||||
needles_llsd[needle_name]["region_name"] = needle.mRegionName;
|
||||
needles_llsd[needle_name]["chat_replace"] = needle.mChatReplace;
|
||||
needles_llsd[needle_name]["button_reply"] = needle.mButtonReply;
|
||||
needles_llsd[needle_name]["textbox_reply"] = needle.mTextBoxReply;
|
||||
needles_llsd[needle_name]["sender_name_match_type"] = needle.mSenderNameMatchType;
|
||||
needles_llsd[needle_name]["content_match_type"] = needle.mContentMatchType;
|
||||
needles_llsd[needle_name]["owner_id"] = needle.mOwnerID;
|
||||
|
||||
LLSD types_llsd;
|
||||
for (auto type : needle.mTypes)
|
||||
{
|
||||
types_llsd.append(static_cast<S32>(type));
|
||||
}
|
||||
|
||||
needles_llsd[needle_name]["types"] = types_llsd;
|
||||
needles_llsd[needle_name]["enabled"] = needle.mEnabled;
|
||||
needles_llsd[needle_name]["sender_name_case_insensitive"] = needle.mSenderNameCaseInsensitive;
|
||||
needles_llsd[needle_name]["content_case_insensitive"] = needle.mContentCaseInsensitive;
|
||||
}
|
||||
// First assign the current rule set back to the currently selected rule set.
|
||||
assignRuleSet(false);
|
||||
// Export the needles to LLSD storage
|
||||
needles_llsd = exportToLLSD();
|
||||
|
||||
LLSDSerialize::toXML(needles_llsd, file);
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@ class OmnifilterEngine
|
||||
|
||||
typedef std::map<std::string, OmnifilterEngine::OmnifilterEngine::Needle, std::less<>> needle_list_t;
|
||||
needle_list_t& getNeedleList();
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
|
||||
// Typedef for the ordered list which is a vector of strings, used to keep track of the map order, which uses strings to lookup the
|
||||
// needles.
|
||||
typedef std::vector<std::string> needle_ordered_list_t;
|
||||
@@ -114,7 +114,6 @@ class OmnifilterEngine
|
||||
bool setOrderedNeedleName(const S32 needle_index, std::string_view new_name);
|
||||
const Needle* getOrderedNeedle(const S32 index);
|
||||
bool swapNeedles(const S32 index1, const S32 index2);
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
|
||||
Needle& newNeedle(const std::string& needle_name);
|
||||
void renameNeedle(const std::string& old_name, const std::string& new_name);
|
||||
@@ -125,25 +124,45 @@ class OmnifilterEngine
|
||||
|
||||
void init();
|
||||
|
||||
bool setCurrentRuleSet(std::string_view rule_set_name);
|
||||
S32 removeCurrentRuleSet();
|
||||
S32 addNewRuleSet(std::string_view new_name);
|
||||
S32 addClonedRuleSet(std::string_view new_name);
|
||||
bool assignRuleSet(const bool rule_set_to_internal = true);
|
||||
bool assignRuleSetNameFromSettings();
|
||||
std::string getCurrentSelectedRuleSet() { return mCurrentSelectedRuleSet; }
|
||||
needle_ordered_list_t& getOrderedRuleSets() { return mOrderedRuleSets; }
|
||||
std::string_view getOrderedRuleSetName(const S32 index) const;
|
||||
S32 getOrderedRuleSetIndex(std::string_view lookup_name);
|
||||
S32 getOrderedRuleSetSize() { return static_cast<S32>(mOrderedRuleSets.size()); }
|
||||
|
||||
typedef boost::signals2::signal<void(time_t, const std::string&)> log_signal_t;
|
||||
log_signal_t mLogSignal;
|
||||
|
||||
std::vector<std::pair<time_t, std::string>> mLog;
|
||||
|
||||
typedef std::pair<needle_ordered_list_t, needle_list_t> rule_set_t;
|
||||
typedef std::map<std::string, rule_set_t> rule_sets_t;
|
||||
rule_sets_t& getRuleSets() { return mNeedleRuleSets; }
|
||||
|
||||
protected:
|
||||
const Needle* logMatch(const std::string& needle_name, const Needle& needle);
|
||||
bool matchStrings(std::string_view needle_string, std::string_view haystack_string, eMatchType match_type, bool case_insensitive);
|
||||
|
||||
bool importFromLLSD(const LLSD& data);
|
||||
LLSD exportToLLSD();
|
||||
void loadNeedles();
|
||||
void saveNeedles();
|
||||
|
||||
bool tick() override;
|
||||
|
||||
protected:
|
||||
rule_sets_t mNeedleRuleSets;
|
||||
std::string mCurrentSelectedRuleSet;
|
||||
needle_ordered_list_t mOrderedRuleSets;
|
||||
|
||||
needle_list_t mNeedles;
|
||||
// <FS:minerjr> [FIRE-36649] - Add reordering to OmniFilter
|
||||
needle_ordered_list_t mOrderedNeedles;
|
||||
// </FS:minerjr> [FIRE-36649]
|
||||
|
||||
std::string mNeedlesXMLPath;
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<text name="uploader_label">
|
||||
Przesłał/a:
|
||||
</text>
|
||||
<button label="Profil" name="openprofile"/>
|
||||
<button label="Profil" name="openprofile"/>
|
||||
<text name="upload_time_label">
|
||||
Data:
|
||||
</text>
|
||||
|
||||
@@ -6,22 +6,33 @@
|
||||
Podskakiwanie piersi jest dostępne tylko
|
||||
dla kobiecych awatarów.
|
||||
</text>
|
||||
<accordion_tab name="physics_breasts_updown_tab" title="Podskakiwanie piersi"/>
|
||||
</panel>
|
||||
<panel name="physics_breast_inout_tab_holder" title="Rowek m. piers.">
|
||||
<text name="physics_breast_inout_not_available">
|
||||
Rowek między piersiami jest dostępny tylko
|
||||
dla kobiecych awatarów.
|
||||
</text>
|
||||
<accordion_tab name="physics_breasts_inout_tab" title="Rowek między piersiami"/>
|
||||
</panel>
|
||||
<panel name="physics_breast_leftright_tab_holder" title="Koł. piersi">
|
||||
<text name="physics_breast_leftright_not_available">
|
||||
Kołysanie piersi jest dostępne tylko
|
||||
dla kobiecych awatarów.
|
||||
</text>
|
||||
<accordion_tab name="physics_breasts_leftright_tab" title="Kołysanie piersi"/>
|
||||
</panel>
|
||||
<panel name="physics_belly_tab_holder" title="Podsk. brzucha">
|
||||
<accordion_tab name="physics_belly_tab" title="Podskakiwanie brzucha"/>
|
||||
</panel>
|
||||
<panel name="physics_butt_tab_holder" title="Podsk. pośladk.">
|
||||
<accordion_tab name="physics_butt_tab" title="Podskakiwanie pośladków"/>
|
||||
</panel>
|
||||
<panel name="physics_butt_leftright_tab_holder" title="Koł. pośladków">
|
||||
<accordion_tab name="physics_butt_leftright_tab" title="Kołysanie pośladków"/>
|
||||
</panel>
|
||||
<panel name="physics_advanced_tab_holder" title="Zaaw. parametry">
|
||||
<accordion_tab name="physics_advanced_tab" title="Zaawansowane parametry"/>
|
||||
</panel>
|
||||
<panel name="physics_belly_tab_holder" title="Podsk. brzucha"/>
|
||||
<panel name="physics_butt_tab_holder" title="Podsk. pośladk."/>
|
||||
<panel name="physics_butt_leftright_tab_holder" title="Koł. pośladków"/>
|
||||
<panel name="physics_advanced_tab_holder" title="Zaaw. parametry"/>
|
||||
</tab_container>
|
||||
</panel>
|
||||
|
||||
@@ -1,64 +1,43 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="camera_floater" title="Controles da câmera">
|
||||
<floater name="camera_floater" title="Controles da Câmera">
|
||||
<floater.string name="rotate_tooltip">
|
||||
Girar câmera em torno do foco
|
||||
Girar a câmera ao redor do foco
|
||||
</floater.string>
|
||||
<floater.string name="zoom_tooltip">
|
||||
Aproximar câmera do foco
|
||||
Zoom da câmera no foco
|
||||
</floater.string>
|
||||
<floater.string name="move_tooltip">
|
||||
Mover câmera para cima, baixo, esquerda e direita
|
||||
Mover a câmera para cima, baixo, esquerda e direita
|
||||
</floater.string>
|
||||
<floater.string name="free_mode_title">
|
||||
Ver objeto
|
||||
Mostrar objeto
|
||||
</floater.string>
|
||||
<string name="inactive_combo_text">
|
||||
Usar predefinição...
|
||||
Predefinição...
|
||||
</string>
|
||||
|
||||
<panel name="controls">
|
||||
<panel name="zoom">
|
||||
<joystick_rotate name="cam_rotate_stick" tool_tip="Orbitar câmera em torno do foco"/>
|
||||
<button name="roll_left" tool_tip="Inclinar câmera para esquerda" />
|
||||
<button name="roll_right" tool_tip="Inclinar câmera para direita" />
|
||||
<slider_bar name="zoom_slider" tool_tip="Aproximar câmera do foco"/>
|
||||
<joystick_track name="cam_track_stick" tool_tip="Mover câmera para cima, baixo, esquerda e direita"/>
|
||||
<joystick_rotate name="cam_rotate_stick" tool_tip="Girar câmera"/>
|
||||
<button name="roll_left" tool_tip="Inclinar à esquerda" />
|
||||
<button name="roll_right" tool_tip="Inclinar à direita" />
|
||||
<slider_bar name="zoom_slider" tool_tip="Aproximar câmera"/>
|
||||
<joystick_track name="cam_track_stick" tool_tip="Mover câmera"/>
|
||||
</panel>
|
||||
</panel>
|
||||
<panel name="buttons_panel">
|
||||
<panel_camera_item name="front_view" tool_tip="Vista frontal">
|
||||
<panel_camera_item.text name="front_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="group_view" tool_tip="Vista lateral">
|
||||
<panel_camera_item.text name="side_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="rear_view" tool_tip="Vista traseira">
|
||||
<panel_camera_item.text name="rear_view_text">
|
||||
</panel_camera_item.text>
|
||||
<panel_camera_item name="tpp_view" tool_tip="Vista TPP">
|
||||
<panel_camera_item.text name="tpp_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="object_view" tool_tip="Vista do objeto">
|
||||
<panel_camera_item.text name="object_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="mouselook_view" tool_tip="Mouselook">
|
||||
<panel_camera_item.text name="mouselook_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="reset_view" tool_tip="Redefinir vista">
|
||||
<panel_camera_item.text name="reset_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="front_view" tool_tip="Câmera frontal"/>
|
||||
<panel_camera_item name="group_view" tool_tip="Câmera sobre o ombro"/>
|
||||
<panel_camera_item name="rear_view" tool_tip="Câmera traseira"/>
|
||||
<panel_camera_item name="tpp_view" tool_tip="Terceira pessoa"/>
|
||||
<panel_camera_item name="object_view" tool_tip="Câmera de objeto"/>
|
||||
<panel_camera_item name="mouselook_view" tool_tip="Câmera de mouselook"/>
|
||||
<panel_camera_item name="reset_view" tool_tip="Redefinir câmera"/>
|
||||
</panel>
|
||||
<combo_box name="preset_combo">
|
||||
<combo_box.item label="Usar predefinição" name="Use preset"/>
|
||||
</combo_box>
|
||||
<button name="gear_btn" tool_tip="Predefinições de câmera"/>
|
||||
<button name="gear_btn" tool_tip="Configurações da câmera"/>
|
||||
<button label="Posição..." name="camera_position_btn"/>
|
||||
<button label="Salvar" name="save_btn"/>
|
||||
</floater>
|
||||
</floater>
|
||||
@@ -3,7 +3,7 @@
|
||||
<panel name="avatar_eye_color_panel">
|
||||
<texture_picker label="Iris" name="Iris" tool_tip="Clique aqui para escolher uma imagem"/>
|
||||
</panel>
|
||||
<panel name="eyes_main_tab_holder">
|
||||
<panel name="eyes_main_tab_holder" title="Olhos">
|
||||
<accordion name="eyes_main_accordion">
|
||||
<accordion_tab name="eyes_main_tab" title="Olhos"/>
|
||||
</accordion>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<texture_picker label="Textura" name="Fabric" tool_tip="Clique aqui para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique aqui para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="gloves_main_tab_holder">
|
||||
<panel name="gloves_main_tab_holder" title="Luvas">
|
||||
<accordion name="gloves_main_accordion">
|
||||
<accordion_tab name="gloves_main_tab" title="Luvas"/>
|
||||
</accordion>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<texture_picker label="Textura inferior" name="Lower Fabric" tool_tip="Clique aqui para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique aqui para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="jacket_main_tab_holder">
|
||||
<panel name="jacket_main_tab_holder" title="Jaqueta">
|
||||
<accordion name="jacket_main_accordion">
|
||||
<accordion_tab name="jacket_main_tab" title="Jaqueta"/>
|
||||
</accordion>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<texture_picker label="Textura" name="Fabric" tool_tip="Clique aqui para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique aqui para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="pants_main_tab_holder">
|
||||
<panel name="pants_main_tab_holder" title="Calça">
|
||||
<accordion name="pants_main_accordion">
|
||||
<accordion_tab name="pants_main_tab" title="Calça"/>
|
||||
</accordion>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<texture_picker label="Textura" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="shirt_main_tab_holder">
|
||||
<panel name="shirt_main_tab_holder" title="Camisa">
|
||||
<accordion name="shirt_main_accordion">
|
||||
<accordion_tab name="shirt_main_tab" title="Camisa"/>
|
||||
</accordion>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<texture_picker label="Textura" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="shoes_main_tab_holder">
|
||||
<panel name="shoes_main_tab_holder" title="Sapatos">
|
||||
<accordion name="shoes_main_accordion">
|
||||
<accordion_tab name="shoes_main_tab" title="Sapatos"/>
|
||||
</accordion>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<texture_picker label="Textura" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="skirt_main_tab_holder">
|
||||
<panel name="skirt_main_tab_holder" title="Saia">
|
||||
<accordion name="skirt_main_accordion">
|
||||
<accordion_tab name="skirt_main_tab" title="Saia"/>
|
||||
</accordion>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<texture_picker label="Textura" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="socks_main_tab_holder">
|
||||
<panel name="socks_main_tab_holder" title="Meias">
|
||||
<accordion name="socks_main_accordion">
|
||||
<accordion_tab name="socks_main_tab" title="Meias"/>
|
||||
</accordion>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<texture_picker label="Textura" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="underpants_main_tab_holder">
|
||||
<panel name="underpants_main_tab_holder" title="Cueca">
|
||||
<accordion name="underpants_main_accordion">
|
||||
<accordion_tab name="underpants_main_tab" title="Cueca"/>
|
||||
</accordion>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<texture_picker label="Textura" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
|
||||
<color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Clique para abrir o seletor de cores"/>
|
||||
</panel>
|
||||
<panel name="undershirt_main_tab_holder">
|
||||
<panel name="undershirt_main_tab_holder" title="Camiseta">
|
||||
<accordion name="undershirt_main_accordion">
|
||||
<accordion_tab name="undershirt_main_tab" title="Regata"/>
|
||||
</accordion>
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel label="Perfil do grupo" name="GroupInfo">
|
||||
<panel.string name="default_needs_apply_text">
|
||||
Estas alterações não foram salvas.
|
||||
</panel.string>
|
||||
<panel.string name="want_apply_text">
|
||||
Deseja salvar estas alterações?
|
||||
</panel.string>
|
||||
<panel.string name="group_join_btn">
|
||||
Entrar (L$[AMOUNT])
|
||||
</panel.string>
|
||||
<panel.string name="group_join_free">
|
||||
Grátis
|
||||
</panel.string>
|
||||
<panel.string name="group_member">
|
||||
Membro
|
||||
</panel.string>
|
||||
<panel.string name="join_txt">
|
||||
Entrar
|
||||
</panel.string>
|
||||
<panel.string name="leave_txt">
|
||||
Sair
|
||||
</panel.string>
|
||||
<panel name="group_info_top">
|
||||
<text_editor name="group_name" value="(carregando...)"/>
|
||||
<line_editor label="Digite aqui o novo nome do grupo" name="group_name_editor"/>
|
||||
</panel>
|
||||
<button label="Ativar" name="btn_activate"/>
|
||||
<button label="Chat" name="btn_chat"/>
|
||||
<button label="Chamada em grupo" name="btn_call" tool_tip="Ligar para este grupo"/>
|
||||
<button label="Salvar" name="btn_apply"/>
|
||||
</panel>
|
||||
@@ -2816,18 +2816,6 @@ Bu mesaj yenidən baş verərsə, kömək üçün http://support.secondlife.com
|
||||
<string name="PicksClassifiedsLoadingText">
|
||||
Yüklənir...
|
||||
</string>
|
||||
<string name="NoPicksText">
|
||||
Seçilmiş yarartmamızınız.
|
||||
</string>
|
||||
<string name="NoAvatarPicksText">
|
||||
İstifadəçinin seçilmişləri yoxdur
|
||||
</string>
|
||||
<string name="NoClassifiedsText">
|
||||
Heç bir elan yaartmamızınız. Elan etmək üçün Yarat düyməsini basın.
|
||||
</string>
|
||||
<string name="NoAvatarClassifiedsText">
|
||||
İstifadəçinin elanları yoxdur
|
||||
</string>
|
||||
<string name="MultiPreviewTitle">
|
||||
Önizləmə
|
||||
</string>
|
||||
|
||||
@@ -3,6 +3,19 @@
|
||||
<floater.string name="OmnifilterNewNeedle">
|
||||
NEUE REGEL
|
||||
</floater.string>
|
||||
<floater.string name="OmnifilterNewRuleSet">
|
||||
NEUES REGELSET
|
||||
</floater.string>
|
||||
<floater.string name="OmnifilterCloneRuleSet">
|
||||
GEKLONTES REGELSET
|
||||
</floater.string>
|
||||
<panel name="needle_rule_set_controls">
|
||||
<text name="lbl_ruleset" value="Regelsets:"/>
|
||||
<combo_box name="cmb_rule_sets" tool_tip="Regelset für den Omni-Filter auswählen."/>
|
||||
<button name="btn_rule_set_new" label="Neues Regelset" tool_tip="Neues, leeres Regelset für den Omni-Filter erstellen."/>
|
||||
<button name="btn_rule_set_clone" label="Regelset klonen" tool_tip="Erstellt einen Klon des aktuellen Omni-Filter-Regelsets."/>
|
||||
<button name="btn_rule_set_remove" label="Regelset löschen" tool_tip="Löscht das aktuelle Omni-Filter-Regelset."/>
|
||||
</panel>
|
||||
<layout_stack name="needle_list_stack">
|
||||
<layout_panel name="needle_list_layout">
|
||||
<check_box name="enable_omnifilter" label="Omnifilter aktivieren"/>
|
||||
|
||||
@@ -1380,6 +1380,10 @@ nach
|
||||
<button name="Cancel" text="Abbrechen"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification label="Filter-Tab schließen" name="FSInventoryCustomTabClose">
|
||||
Filter-Tab „[NAME]“ schließen? Seine gespeicherten Filter werden entfernt.
|
||||
<usetemplate name="okcancelignore" notext="Abbrechen" yestext="Ja, schließen" ignoretext="Bestätigen, bevor ein benutzerdefinierter Filter-Tab geschlossen wird"/>
|
||||
</notification>
|
||||
<notification label="Geste umbenennen" name="RenameGesture">
|
||||
Neuer Gesten-Name:
|
||||
<form name="form">
|
||||
@@ -6065,5 +6069,51 @@ Der Name wird überprüft, bevor die Zuweisung gespeichert wird.
|
||||
Die Region '[REGION]' konnte nicht gefunden werden. Bitte überprüfen Sie den Namen und versuchen Sie es erneut.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="OmniFilterNewRuleSet">
|
||||
Name für neues Regelset eingeben:
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Abbrechen"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="OmniFilterrNewRuleSetBlank">
|
||||
Leere Namen sind nicht erlaubt. Bitte erneut mit einem Namen versuchen.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="OmniFilterNewRuleSetDuplicate">
|
||||
Doppelte Namen sind nicht erlaubt. Bitte erneut mit einem anderen Namen versuchen.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="OmniFilterCloneRuleSet">
|
||||
Name für geklontes Regelset eingeben:
|
||||
<form name="form">
|
||||
<button name="OK" text="OK"/>
|
||||
<button name="Cancel" text="Abbrechen"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="OmniFilterCloneRuleSetBlank">
|
||||
Leere Namen sind nicht erlaubt. Bitte erneut mit einem Namen versuchen.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="OmniFilterCloneRuleSetDuplicate">
|
||||
Doppelte Namen sind nicht erlaubt. Bitte erneut mit einem anderen Namen versuchen.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="OmniFilterRemoveRuleSet">
|
||||
Sind Sie sicher, dass sie Regelset [RULESETNAME] löschen möchten?
|
||||
<usetemplate name="okcancelignore" ignoretext="Bestätigen, bevor ein Regelset gelöscht wird." notext="Abbrechen" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="OmniFilterRemoveRuleSetDefault">
|
||||
Standard-Regelset kann nicht geklöscht werden.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="OmniFilterRemoveRuleSetOutofBounds">
|
||||
Regelset kann nicht gelöscht werden, da sich ein Index außerhalb des Wertebereichs befindet.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="OmniFilterRemoveRuleSetInvalidName">
|
||||
Regelset kann nicht gelöscht werden, da kein Set mit dem Namen gefunden wurde.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
</notifications>
|
||||
|
||||
@@ -4927,12 +4927,6 @@ Erfahren Sie mehr unter https://second.life/scripted-agents.
|
||||
<string name="share_alert">
|
||||
Objekte aus dem Inventar hier her ziehen
|
||||
</string>
|
||||
<string name="facebook_post_success">
|
||||
Sie haben auf Facebook gepostet.
|
||||
</string>
|
||||
<string name="facebook_post_success">
|
||||
Sie haben auf Facebook gepostet.
|
||||
</string>
|
||||
<string name="flickr_post_success">
|
||||
Sie haben auf Flickr gepostet.
|
||||
</string>
|
||||
@@ -5919,9 +5913,6 @@ Setzen Sie den Editorpfad in Anführungszeichen
|
||||
<string name="Command_AboutLand_Label">
|
||||
Landinformationen
|
||||
</string>
|
||||
<string name="Command_AboutLand_Label">
|
||||
Landinformationen
|
||||
</string>
|
||||
<string name="Command_360_Capture_Label">
|
||||
360° Foto
|
||||
</string>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
can_resize="true"
|
||||
can_minimize="true"
|
||||
can_close="true"
|
||||
height="400"
|
||||
height="425"
|
||||
min_height="348"
|
||||
min_width="668"
|
||||
layout="topleft"
|
||||
@@ -19,13 +19,73 @@
|
||||
<floater.string name="OmnifilterNewNeedle">
|
||||
NEW RULE
|
||||
</floater.string>
|
||||
<floater.string name="OmnifilterNewRuleSet">
|
||||
NEW RULE SET
|
||||
</floater.string>
|
||||
<floater.string name="OmnifilterCloneRuleSet">
|
||||
CLONED RULE SET
|
||||
</floater.string>
|
||||
|
||||
<panel
|
||||
name="needle_rule_set_controls"
|
||||
layout="topleft"
|
||||
follows="left|top|right"
|
||||
height="25"
|
||||
left="0"
|
||||
min_height="25"
|
||||
top="20">
|
||||
<text
|
||||
name="lbl_ruleset"
|
||||
layout="topleft"
|
||||
follows="left|top"
|
||||
height="20"
|
||||
width="70"
|
||||
left="8"
|
||||
top="0"
|
||||
valign="center"
|
||||
value="Rule Sets:"/>
|
||||
<combo_box
|
||||
height="20"
|
||||
layout="topleft"
|
||||
left_pad="4"
|
||||
follows="left|top"
|
||||
name="cmb_rule_sets"
|
||||
tool_tip="Choose the Omnifilter Rule Set to use."
|
||||
width="150"/>
|
||||
<button
|
||||
name="btn_rule_set_new"
|
||||
layout="topleft"
|
||||
follows="left|top"
|
||||
width="150"
|
||||
height="20"
|
||||
left_pad="4"
|
||||
label="New Rule Set"
|
||||
tool_tip="Create a new blank Omnifilter Rule Set."/>
|
||||
<button
|
||||
name="btn_rule_set_clone"
|
||||
layout="topleft"
|
||||
follows="left|top"
|
||||
width= "150"
|
||||
height="20"
|
||||
left_pad="4"
|
||||
label="Clone Rule Set"
|
||||
tool_tip="Create a clone of the current Omnifilter Rule Set."/>
|
||||
<button
|
||||
name="btn_rule_set_remove"
|
||||
layout="topleft"
|
||||
follows="left|top"
|
||||
width= "150"
|
||||
height="20"
|
||||
left_pad="4"
|
||||
label="Remove Rule Set"
|
||||
tool_tip="Remove the current Omnifilter Rule Set."/>
|
||||
</panel>
|
||||
<layout_stack
|
||||
name="needle_list_stack"
|
||||
layout="topleft"
|
||||
follows="left|top|bottom"
|
||||
height="374"
|
||||
top="20"
|
||||
top="45"
|
||||
left="8"
|
||||
width="190"
|
||||
orientation="vertical"
|
||||
|
||||
@@ -3514,6 +3514,20 @@ See https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
label="Close Filter Tab"
|
||||
name="FSInventoryCustomTabClose"
|
||||
type="alertmodal">
|
||||
Close the "[NAME]" filter tab? Its saved filters will be removed.
|
||||
<tag>confirm</tag>
|
||||
<usetemplate
|
||||
name="okcancelignore"
|
||||
notext="Cancel"
|
||||
yestext="Yes, close"
|
||||
ignoretext="Confirm before I close a custom inventory filter tab"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
label="Rename Gesture"
|
||||
@@ -15190,4 +15204,139 @@ You can enable saving transcripts under Preferences > Privacy > Logs &
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
<!-- </FS:TJ>-->
|
||||
<!-- <FS:minerjr> [FIRE-36763] - Add rule sets to Omnifilter -->
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterNewRuleSet"
|
||||
type="alertmodal">
|
||||
Enter a name for the new rule set:
|
||||
<tag>confirm</tag>
|
||||
<form name="form">
|
||||
<input name="new_name" type="text" width="300" default="true">
|
||||
[RULESETNAME]
|
||||
</input>
|
||||
<button
|
||||
default="true"
|
||||
index="0"
|
||||
name="OK"
|
||||
text="OK"/>
|
||||
<button
|
||||
index="1"
|
||||
name="Cancel"
|
||||
text="Cancel"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterrNewRuleSetBlank"
|
||||
sound="UISndAlert"
|
||||
persist="true"
|
||||
type="alertmodal">
|
||||
Blank names are not allowed. Please try again with a name.
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterNewRuleSetDuplicate"
|
||||
sound="UISndAlert"
|
||||
persist="true"
|
||||
type="alertmodal">
|
||||
Duplicate names are not allowed. Please try again with a different name.
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterCloneRuleSet"
|
||||
type="alertmodal">
|
||||
Enter a name to the cloned rule set:
|
||||
<tag>confirm</tag>
|
||||
<form name="form">
|
||||
<input name="new_name" type="text" width="300" default="true">
|
||||
[RULESETNAME]
|
||||
</input>
|
||||
<button
|
||||
default="true"
|
||||
index="0"
|
||||
name="OK"
|
||||
text="OK"/>
|
||||
<button
|
||||
index="1"
|
||||
name="Cancel"
|
||||
text="Cancel"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterCloneRuleSetBlank"
|
||||
sound="UISndAlert"
|
||||
persist="true"
|
||||
type="alertmodal">
|
||||
Blank names are not allowed. Please try again with a name.
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterCloneRuleSetDuplicate"
|
||||
sound="UISndAlert"
|
||||
persist="true"
|
||||
type="alertmodal">
|
||||
Duplicate names are not allowed. Please try again with a different name.
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterRemoveRuleSet"
|
||||
type="alertmodal">
|
||||
Are you sure you want to remove [RULESETNAME]?
|
||||
<tag>confirm</tag>
|
||||
<usetemplate
|
||||
ignoretext="Confirm before I remove a rule set."
|
||||
name="okcancelignore"
|
||||
notext="Cancel"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterRemoveRuleSetDefault"
|
||||
sound="UISndAlert"
|
||||
persist="true"
|
||||
type="alertmodal">
|
||||
Unable to remove the default rule ret.
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterRemoveRuleSetOutofBounds"
|
||||
sound="UISndAlert"
|
||||
persist="true"
|
||||
type="alertmodal">
|
||||
Unable to remove the rule set due to index out of bounds.
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="OmniFilterRemoveRuleSetInvalidName"
|
||||
sound="UISndAlert"
|
||||
persist="true"
|
||||
type="alertmodal">
|
||||
Unable to remove the rule set due to name not found.
|
||||
<usetemplate
|
||||
name="okbutton"
|
||||
yestext="OK"/>
|
||||
</notification>
|
||||
<!-- </FS:minerjr> [FIRE-36763] -->
|
||||
</notifications>
|
||||
|
||||
@@ -2615,10 +2615,6 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia
|
||||
<string name="PicksClassifiedsLoadingText">
|
||||
Cargando...
|
||||
</string>
|
||||
<string name="NoPicksText">No has creado ningún destacado.</string>
|
||||
<string name="NoAvatarPicksText">El usuario no tiene destacados</string>
|
||||
<string name="NoClassifiedsText">No has creado ningún clasificado. Pulsa el botón '+' para crear uno.</string>
|
||||
<string name="NoAvatarClassifiedsText">El usuario no tiene clasificados</string>
|
||||
<string name="MultiPreviewTitle">
|
||||
Vista previa
|
||||
</string>
|
||||
@@ -4598,9 +4594,6 @@ Más información en https://second.life/scripted-agents.
|
||||
<string name="share_alert">
|
||||
Arrastra aquí items del inventario
|
||||
</string>
|
||||
<string name="facebook_post_success">
|
||||
Has publicado en Facebook.
|
||||
</string>
|
||||
<string name="flickr_post_success">
|
||||
Has publicado en Flickr.
|
||||
</string>
|
||||
|
||||
@@ -3,6 +3,19 @@
|
||||
<floater.string name="OmnifilterNewNeedle">
|
||||
NOUVELLE RÈGLE
|
||||
</floater.string>
|
||||
<floater.string name="OmnifilterNewRuleSet">
|
||||
NOUVEAU JEU DE RÈGLES
|
||||
</floater.string>
|
||||
<floater.string name="OmnifilterCloneRuleSet">
|
||||
JEU DE RÈGLES CLONÉ
|
||||
</floater.string>
|
||||
<panel name="needle_rule_set_controls">
|
||||
<text name="lbl_ruleset" value="Jeux règles:"/>
|
||||
<combo_box name="cmb_rule_sets" tool_tip="Sélectionnez le jeu de règle omnifiltre à utiliser."/>
|
||||
<button name="btn_rule_set_new" label="Nouveau jeu de règles" tool_tip="Crée un nouveau jeu de règles vide."/>
|
||||
<button name="btn_rule_set_clone" label="Cloner le jeu de règles" tool_tip="Crée un clone du jeu de règles omnifiltre actuel."/>
|
||||
<button name="btn_rule_set_remove" label="Suppr. le jeu de règles" tool_tip="Supprime le jeu de règles omnifiltre actuel."/>
|
||||
</panel>
|
||||
<layout_stack name="needle_list_stack">
|
||||
<layout_panel name="needle_list_layout">
|
||||
<check_box name="enable_omnifilter" label="Activer omnifiltre"/>
|
||||
|
||||
@@ -3,8 +3,11 @@
|
||||
<menu_item_call label="Téléporter" name="Teleport To Landmark"/>
|
||||
<menu_item_call label="Voir sur la carte" name="Show On Map"/>
|
||||
<menu_item_call label="Voir/Modifier le repère" name="Landmark Open"/>
|
||||
<menu_item_call label="Déplacer dans Repères" name="Move to Landmarks"/>
|
||||
<menu_item_call label="Copier la SLurl" name="Copy slurl"/>
|
||||
<menu_item_call label="Favori dansle profil" name="create_pick"/>
|
||||
<menu_item_call label="Copier" name="Landmark Copy"/>
|
||||
<menu_item_call label="Coller" name="Landmark Paste"/>
|
||||
<menu_item_call label="Renommer" name="rename"/>
|
||||
<menu_item_call label="Supprimer" name="Delete"/>
|
||||
</menu>
|
||||
|
||||
@@ -5391,7 +5391,7 @@ Vous ne pouvez pas annuler cette action.
|
||||
</notification>
|
||||
<notification name="RemoveContactsFromSet">
|
||||
Êtes-vous sûr de vouloir supprimer ces avatars [TARGET] de [SET_NAME] ?
|
||||
<usetemplate gnoretext="Confirmer avant de supprimer plusieurs avatars d'un groupe de contacts" name="okcancelignore" notext="Cancel" yestext="OK"/>
|
||||
<usetemplate ignoretext="Confirmer avant de supprimer plusieurs avatars d'un groupe de contacts" name="okcancelignore" notext="Cancel" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="AddToContactSetSingleSuccess">
|
||||
[NAME] a été ajouté à [SET].
|
||||
@@ -5792,6 +5792,54 @@ Message d'erreur :
|
||||
Vous pouvez activer l'enregistrement des transcriptions dans Préférences > Confidentialité > Journaux et transcriptions.
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterNewRuleSet">
|
||||
Entrez le nom du nouveau jeu de règles :
|
||||
<form name="form">
|
||||
<button name="Cancel" text="Annuler"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterrNewRuleSetBlank">
|
||||
Les noms vides ne sont pas autorisés. Veuillez réessayer.avec un nom.
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterNewRuleSetDuplicate">
|
||||
Les noms en doubles ne sont pas autorisés. Veuillez réessayer avec un nom différent.
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterCloneRuleSet">
|
||||
Saisissez un nom pour le jeu de règles cloné :
|
||||
<form name="form">
|
||||
<button name="Cancel" text="Annuler"/>
|
||||
</form>
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterCloneRuleSetBlank">
|
||||
Les noms vides ne sont pas autorisés. Veuillez réessayer.avec un nom.
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterCloneRuleSetDuplicate">
|
||||
Les noms en doubles ne sont pas autorisés. Veuillez réessayer avec un nom différent.
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterRemoveRuleSet">
|
||||
Êtes-vous sûr(e) de vouloir supprimer [RULESETNAME]?
|
||||
<tag>confirm</tag>
|
||||
<usetemplate ignoretext="Confirmez avant que je supprime un jeu de règles." name="okcancelignore" notext="Annuler" yestext="OK"/>
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterRemoveRuleSetDefault">
|
||||
Impossible de supprimer le jeu de règles par défaut.
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterRemoveRuleSetOutofBounds">
|
||||
Unable to remove the Rule Set due to index out of bounds.
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterRemoveRuleSetInvalidName">
|
||||
Unable to remove the Rule Set due to name not found.>
|
||||
</notification>
|
||||
|
||||
<notification name="FSSetTitleRegion">
|
||||
Entrez le nom exact d'une région à assigner au titre de groupe sélectionné.
|
||||
Le nom sera vérifié avant l'enregistrement de l'assignation.
|
||||
|
||||
@@ -251,6 +251,7 @@
|
||||
<text name="FSCmdLineTeleportHome_txt">Se téléporter à son domicile (ex: cmd)</text>
|
||||
<text name="FSCmdLineMapTo_txt">Se téléporter dans une sim (ex: cmd simname)</text>
|
||||
<check_box label="Utilise la même position d'une sim à l'autre" name="toggle"/>
|
||||
<check_box label="Envoyer la sortie des commandes vers le canal :" name="FSCmdLineAnnounceToChannel"/>
|
||||
</panel>
|
||||
</tab_container>
|
||||
</panel>
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<panel label="Protection" name="ProtectionTab">
|
||||
<check_box label="Empêcher de s'asseoir sur les objets par clic simple" name="FSBlockClickSit"/>
|
||||
<check_box label="Aperçu de l'URL réelle des liens dans IM et chat de groupe (au survol)" name="FSDisableLabeledChatLinks" tool_tip="Une fois activé, les liens entre crochets dans les IM, le chat de groupe, les conférences ad-hoc et les notices de groupe conservent leur texte, mais le survol affiche instantanément l'URL de destination réelle dans une grande bulle. Aide à repérer le phishing où l'étiquette masque une autre destination. Le chat à proximité utilise l'option ci-dessous. Le texte intégré au client n'est pas affecté."/>
|
||||
<check_box label="Aperçu de l'URL réelle des liens entre parenthèses dans le chat de proximité et le chat d'objet (au survol)" name="FSDisableLabeledChatLinksNearbyChat" tool_tip="Lorsque cette option est activée, les liens entre crochets (étiquetés) dans le chat local et le texte des objets conservent leur libellé, mais un survol de la souris affiche instantanément l'URL de destination réelle dans une grande info-bulle. Désactivée par défaut."/>
|
||||
<check_box label="Aperçu de l'URL réelle des liens dans le chat de proximité et le chat d'objet (au survol)" name="FSDisableLabeledChatLinksNearbyChat" tool_tip="Lorsque cette option est activée, les liens entre crochets (étiquetés) dans le chat local et le texte des objets conservent leur libellé, mais un survol de la souris affiche instantanément l'URL de destination réelle dans une grande info-bulle. Désactivée par défaut."/>
|
||||
<check_box label="Permettre aux scripts d'afficher la carte (llMapDestination)" name="ScriptsCanShowUI"/>
|
||||
<text name="revokepermissions_txt">Révoquer les permissions :</text>
|
||||
<radio_group name="FSRevokePerms">
|
||||
|
||||
@@ -2826,18 +2826,6 @@ Si vous continuez à recevoir ce message, veuillez contacter l'assistance de Sec
|
||||
<string name="PicksClassifiedsLoadingText">
|
||||
Chargement...
|
||||
</string>
|
||||
<string name="NoPicksText">
|
||||
Vous n'avez pas créé de favoris.
|
||||
</string>
|
||||
<string name="NoAvatarPicksText">
|
||||
L'utilisateur n'a pas de favoris.
|
||||
</string>
|
||||
<string name="NoClassifiedsText">
|
||||
Vous n'avez pas créé d'annonces. Cliquez sur le bouton Plus ci-dessous pour créer une annonce.
|
||||
</string>
|
||||
<string name="NoAvatarClassifiedsText">
|
||||
L'utilisateur n'a pas d'annonces
|
||||
</string>
|
||||
<string name="MultiPreviewTitle">
|
||||
Prévisualiser
|
||||
</string>
|
||||
@@ -4863,9 +4851,6 @@ Pour en savoir plus, rendez-vous sur https://second.life/scripted-agents.
|
||||
<string name="share_alert">
|
||||
Faire glisser les objets de l'inventaire ici
|
||||
</string>
|
||||
<string name="facebook_post_success">
|
||||
Vous avez publié sur Facebook.
|
||||
</string>
|
||||
<string name="flickr_post_success">
|
||||
Vous avez publié sur Flickr.
|
||||
</string>
|
||||
|
||||
@@ -4774,9 +4774,6 @@ Scopri di più su https://second.life/scripted-agents.
|
||||
<string name="share_alert">
|
||||
Trascinare qui oggetti da inventario
|
||||
</string>
|
||||
<string name="facebook_post_success">
|
||||
Hai pubblicato su Facebook.
|
||||
</string>
|
||||
<string name="flickr_post_success">
|
||||
Hai pubblicato su Flickr.
|
||||
</string>
|
||||
|
||||
@@ -465,9 +465,6 @@ https://secondlife.com/viewer-access-faq
|
||||
<string name="TooltipFlagNoEdit">
|
||||
編集禁止
|
||||
</string>
|
||||
<string name="TooltipFlagNoEdit">
|
||||
グループ作成
|
||||
</string>
|
||||
<string name="TooltipFlagNotSafe">
|
||||
危険
|
||||
</string>
|
||||
@@ -1320,9 +1317,6 @@ https://secondlife.com/viewer-access-faq
|
||||
<string name="xml_file">
|
||||
XMLファイル
|
||||
</string>
|
||||
<string name="csv_files">
|
||||
CSVファイル
|
||||
</string>
|
||||
<string name="raw_file">
|
||||
RAWファイル
|
||||
</string>
|
||||
@@ -2001,9 +1995,6 @@ https://support.secondlife.com よりSecond Lifeのサポートまでお問い
|
||||
<string name="InvFolder Materials">
|
||||
マテリアル
|
||||
</string>
|
||||
<string name="InvFolder Settings">
|
||||
自然環境の設定
|
||||
</string>
|
||||
<!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
|
||||
<string name="InvFolder Friends">
|
||||
フレンド
|
||||
@@ -2872,19 +2863,6 @@ https://support.secondlife.com よりSecond Lifeのサポートまでお問い
|
||||
<string name="PicksClassifiedsLoadingText">
|
||||
読み込んでいます…
|
||||
</string>
|
||||
<!-- FS:KC legacy profiles -->
|
||||
<string name="NoPicksText">
|
||||
ピックを作成していません。
|
||||
</string>
|
||||
<string name="NoAvatarPicksText">
|
||||
このユーザーにはピックがありません。
|
||||
</string>
|
||||
<string name="NoClassifiedsText">
|
||||
クラシファイド広告を作成していません。作成するには、下にある「+」ボタンをクリックします。
|
||||
</string>
|
||||
<string name="NoAvatarClassifiedsText">
|
||||
このユーザーにはクラシファイド広告がありません。
|
||||
</string>
|
||||
<!-- Multi Preview Floater -->
|
||||
<string name="MultiPreviewTitle">
|
||||
プレビュー
|
||||
@@ -5726,7 +5704,6 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||
<string name="Command_Move_Lock_Label">移動ロック</string>
|
||||
<string name="Command_Blocklist_Label">ブロックリスト</string>
|
||||
<string name="Command_ResyncAnimations_Label">アニメーション再同期</string>
|
||||
<string name="Command_RegionTracker_Label">リージョントラッカー</string>
|
||||
<string name="Command_Group_Titles_Label">グループのタイトル</string>
|
||||
<string name="Command_Wearable_Favorites_Label">お気に入りの着用物やHUD</string>
|
||||
<string name="Command_RFO_Label">フレンドのみ表示</string>
|
||||
@@ -5815,9 +5792,6 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||
<string name="Command_Profile_Tooltip">
|
||||
自分のプロフィールの表示や編集を行います。
|
||||
</string>
|
||||
<string name="Command_RegionTracker_Tooltip">
|
||||
様々なリージョンの状況を追跡します。
|
||||
</string>
|
||||
<string name="Command_Report_Abuse_Tooltip">
|
||||
嫌がらせを報告します。
|
||||
</string>
|
||||
@@ -6391,9 +6365,6 @@ Rez時間:[OBJECT_REZ_TIME]
|
||||
<string name="preproc_toggle_warning">プリプロセッサを切り替えても、このエディターを閉じて再度開くまで完全には有効になりません。</string>
|
||||
<!-- <FS:Cron> FIRE-9335 -->
|
||||
<!-- <LSL Preprocessor -->
|
||||
<string name="preproc_toggle_warning">
|
||||
プリプロセッサの切り替えは、このエディタを閉じて再度開くまで完全には有効になりません。
|
||||
</string>
|
||||
<string name="fs_preprocessor_starting">
|
||||
[APP_NAME]プリプロセッサを開始しています…
|
||||
</string>
|
||||
|
||||
@@ -3,6 +3,19 @@
|
||||
<floater.string name="OmnifilterNewNeedle">
|
||||
NOWA REGUŁA
|
||||
</floater.string>
|
||||
<floater.string name="OmnifilterNewRuleSet">
|
||||
NOWY ZESTAW REGUŁ
|
||||
</floater.string>
|
||||
<floater.string name="OmnifilterCloneRuleSet">
|
||||
SKLONOWANY ZESTAW REGUŁ
|
||||
</floater.string>
|
||||
<panel name="needle_rule_set_controls">
|
||||
<text name="lbl_ruleset" value="Zest. reguł:" />
|
||||
<combo_box name="cmb_rule_sets" tool_tip="Wybierz zestaw reguł Wszystkofiltra, którego chcesz użyć." />
|
||||
<button name="btn_rule_set_new" label="Nowy zestaw reguł" tool_tip="Utwórz nowy, pusty zestaw reguł Wszystkofiltra." />
|
||||
<button name="btn_rule_set_clone" label="Klonuj zestaw reguł" tool_tip="Utwórz klon bieżącego zestawu reguł Wszystkofiltra." />
|
||||
<button name="btn_rule_set_remove" label="Usuń zestaw reguł" tool_tip="Usuń bieżący zestaw reguł Wszystkofiltra."/>
|
||||
</panel>
|
||||
<layout_stack name="needle_list_stack">
|
||||
<layout_panel name="needle_list_layout">
|
||||
<check_box name="enable_omnifilter" label="Włącz Wszystkofiltr" />
|
||||
|
||||
@@ -1307,6 +1307,10 @@ do
|
||||
<button name="Cancel" text="Anuluj"/>
|
||||
</form>
|
||||
</notification>
|
||||
<notification label="Zamknij zakładkę filtra" name="FSInventoryCustomTabClose">
|
||||
Zamknąć zakładkę filtra "[NAME]"? Jej zapisane filtry zostaną usunięte.
|
||||
<usetemplate name="okcancelignore" notext="Anuluj" yestext="Tak, zamknij" ignoretext="Potwierdzaj przed zamknięciem niestandardowej zakładki filtra szafy" />
|
||||
</notification>
|
||||
<notification label="Zmień nazwę gestu" name="RenameGesture">
|
||||
Nowa nazwa gestu:
|
||||
<form name="form">
|
||||
@@ -5674,5 +5678,41 @@ Nazwa zostanie zweryfikowana przed zapisaniem przypisania.
|
||||
<notification name="FSSetTitleRegionNotFound">
|
||||
Region '[REGION]' nie został znaleziony. Sprawdź nazwę i spróbuj ponownie.
|
||||
</notification>
|
||||
|
||||
<notification name="OmniFilterNewRuleSet">
|
||||
Wprowadź nazwę dla nowego zestawu reguł:
|
||||
<form name="form">
|
||||
<button name="Cancel" text="Anuluj" />
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="OmniFilterrNewRuleSetBlank">
|
||||
Puste nazwy są niedozwolone. Spróbuj ponownie, wpisując nazwę.
|
||||
</notification>
|
||||
<notification name="OmniFilterNewRuleSetDuplicate">
|
||||
Zduplikowane nazwy są niedozwolone. Spróbuj ponownie z inną nazwą.
|
||||
</notification>
|
||||
<notification name="OmniFilterCloneRuleSet">
|
||||
Wprowadź nazwę dla sklonowanego zestawu reguł:
|
||||
<form name="form">
|
||||
<button name="Cancel" text="Anuluj" />
|
||||
</form>
|
||||
</notification>
|
||||
<notification name="OmniFilterCloneRuleSetBlank">
|
||||
Puste nazwy są niedozwolone. Spróbuj ponownie, wpisując nazwę.
|
||||
</notification>
|
||||
<notification name="OmniFilterCloneRuleSetDuplicate">
|
||||
Zduplikowane nazwy są niedozwolone. Spróbuj ponownie z inną nazwą.
|
||||
</notification>
|
||||
<notification name="OmniFilterRemoveRuleSet">
|
||||
Czy na pewno chcesz usunąć [RULESETNAME]?
|
||||
<usetemplate ignoretext="Wymagaj potwierdzenia przed usunięciem zestawu reguł." name="okcancelignore" notext="Anuluj" />
|
||||
</notification>
|
||||
<notification name="OmniFilterRemoveRuleSetDefault">
|
||||
Nie można usunąć domyślnego zestawu reguł.
|
||||
</notification>
|
||||
<notification name="OmniFilterRemoveRuleSetOutofBounds">
|
||||
Nie można usunąć zestawu reguł, ponieważ indeks znajduje się poza zakresem.
|
||||
</notification>
|
||||
<notification name="OmniFilterRemoveRuleSetInvalidName">
|
||||
Nie można usunąć zestawu reguł, ponieważ nie znaleziono podanej nazwy.
|
||||
</notification>
|
||||
</notifications>
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
Tipo:
|
||||
</text>
|
||||
<text name="LandTypeText">
|
||||
Mainland / Homestead
|
||||
Continente / Residencial
|
||||
</text>
|
||||
<text name="ContentRating">
|
||||
Classificação:
|
||||
@@ -205,7 +205,7 @@
|
||||
Tipo:
|
||||
</text>
|
||||
<text name="region_landtype_text">
|
||||
Mainland / Homestead
|
||||
Continente / Residencial
|
||||
</text>
|
||||
<text name="region_maturity_lbl">
|
||||
Classificação:
|
||||
|
||||
@@ -6,7 +6,58 @@
|
||||
<floater.string name="ao_no_animations_loaded">
|
||||
Nenhuma animação carregada
|
||||
</floater.string>
|
||||
<floater.string name="ao_add_blank_label">
|
||||
Novo conjunto vazio...
|
||||
</floater.string>
|
||||
<floater.string name="ao_add_clone_label">
|
||||
Clonar conjunto atual...
|
||||
</floater.string>
|
||||
<floater.string name="ao_dnd_only_on_full_interface">
|
||||
Arraste e solte notecards com configurações de AO apenas na janela maximizada. Clique no ícone de chave inglesa para maximizar.
|
||||
Notecards com configurações de AO só podem ser arrastadas para janelas maximizadas. Clique no ícone de ferramenta para maximizar a janela.
|
||||
</floater.string>
|
||||
<floater.string name="ao_track_main">
|
||||
Trilha principal
|
||||
</floater.string>
|
||||
<floater.string name="ao_no_track_animations">
|
||||
Trilha vazia - solte uma animação aqui
|
||||
</floater.string>
|
||||
<floater.string name="ao_group_tooltip">
|
||||
Grupo de animações - estas são reproduzidas juntas:
|
||||
</floater.string>
|
||||
<floater.string name="ao_member_tooltip">
|
||||
Item do grupo de animações - reproduz junto com o restante do grupo. Clique duas vezes para pré-visualizar esta animação.
|
||||
</floater.string>
|
||||
<floater.string name="ao_cm_expand">
|
||||
Expandir
|
||||
</floater.string>
|
||||
<floater.string name="ao_cm_collapse">
|
||||
Recolher
|
||||
</floater.string>
|
||||
<floater.string name="ao_cm_rename_group">
|
||||
Renomear grupo...
|
||||
</floater.string>
|
||||
<floater.string name="ao_cm_move_out">
|
||||
Remover do grupo
|
||||
</floater.string>
|
||||
<floater.string name="ao_cm_find_original">
|
||||
Encontrar original
|
||||
</floater.string>
|
||||
<floater.string name="ao_cm_delete">
|
||||
Excluir
|
||||
</floater.string>
|
||||
<floater.string name="ao_dnd_merge">
|
||||
Solte para agrupar com esta animação
|
||||
</floater.string>
|
||||
<floater.string name="ao_dnd_add_to_group">
|
||||
Solte para adicionar a este grupo
|
||||
</floater.string>
|
||||
<floater.string name="ao_dnd_add_to_track">
|
||||
Solte para adicionar a esta trilha
|
||||
</floater.string>
|
||||
<floater.string name="ao_dnd_folder_group">
|
||||
Solte uma pasta para criar um grupo de animações
|
||||
</floater.string>
|
||||
<floater.string name="ao_dnd_folder_pour">
|
||||
Solte para adicionar as animações contidas a esta trilha
|
||||
</floater.string>
|
||||
</floater>
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
<layout_stack name="camera_view_layout_stack">
|
||||
<layout_panel name="camera_rotate_layout_panel">
|
||||
<joystick_rotate name="cam_rotate_stick" tool_tip="Orbitar câmera em torno do foco"/>
|
||||
<button name="roll_left" tool_tip="Inclinar câmera para esquerda" />
|
||||
<button name="roll_right" tool_tip="Inclinar câmera para direita" />
|
||||
<button name="roll_left" tool_tip="Inclinar câmera para esquerda"/>
|
||||
<button name="roll_right" tool_tip="Inclinar câmera para direita"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="camera_zoom_layout_panel">
|
||||
<slider_bar name="zoom_slider" tool_tip="Aproximar câmera do foco"/>
|
||||
@@ -31,39 +31,18 @@
|
||||
</layout_stack>
|
||||
</panel>
|
||||
<panel name="buttons_panel">
|
||||
<panel_camera_item name="front_view" tool_tip="Vista frontal">
|
||||
<panel_camera_item.text name="front_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="group_view" tool_tip="Vista lateral">
|
||||
<panel_camera_item.text name="side_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="rear_view" tool_tip="Vista traseira">
|
||||
<panel_camera_item.text name="rear_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="tpp_view" tool_tip="Vista TPP">
|
||||
<panel_camera_item.text name="tpp_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="object_view" tool_tip="Vista do objeto">
|
||||
<panel_camera_item.text name="object_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="mouselook_view" tool_tip="Mouselook">
|
||||
<panel_camera_item.text name="mouselook_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<panel_camera_item name="reset_view" tool_tip="Redefinir vista">
|
||||
<panel_camera_item.text name="reset_view_text">
|
||||
</panel_camera_item.text>
|
||||
</panel_camera_item>
|
||||
<button label="Posição..." name="camera_position_btn"/>
|
||||
<panel_camera_item name="front_view" tool_tip="Vista frontal"/>
|
||||
<panel_camera_item name="group_view" tool_tip="Vista lateral"/>
|
||||
<panel_camera_item name="rear_view" tool_tip="Vista traseira"/>
|
||||
<panel_camera_item name="tpp_view" tool_tip="Vista TPP"/>
|
||||
<panel_camera_item name="object_view" tool_tip="Vista do objeto"/>
|
||||
<panel_camera_item name="mouselook_view" tool_tip="Mouselook"/>
|
||||
<panel_camera_item name="reset_view" tool_tip="Redefinir vista"/>
|
||||
<button label="Posição..." name="camera_position_btn"/>
|
||||
</panel>
|
||||
<panel name="preset_buttons_panel">
|
||||
<combo_box name="preset_combo">
|
||||
<combo_box.item label="Usar predefinição" name="Use preset"/>
|
||||
<combo_box.item label="Usar predefinição" name="Use preset" />
|
||||
</combo_box>
|
||||
<button name="gear_btn" tool_tip="Predefinições de câmera"/>
|
||||
<button name="save_preset_btn" tool_tip="Salvar como predefinição"/>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="floater_classified" title="Classificado" />
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="emojipicker" title="Escolher emoji">
|
||||
<floater.string name="title_for_frequently_used" value="Usados com frequência"/>
|
||||
<line_editor name="Filter" label="Filtrar emoji"/>
|
||||
<floater.string name="title_for_frequently_used" value="Usados com frequência" />
|
||||
<text name="Dummy">Nenhum emoji selecionado</text>
|
||||
</floater>
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="contents" title="Teste de fonte">
|
||||
<text name="linea">
|
||||
OverrideTest, deve ser exibido aqui como Times. (De default/xui/en-us)
|
||||
</text>
|
||||
</floater>
|
||||
</floater>
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="volume_controls" title="Volume Controles" />
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="gltf asset editor">
|
||||
<floater.string name="floater_title" value="Editor de Recursos GLTF" />
|
||||
<floater.string name="scene_title" value="Cena" />
|
||||
<floater.string name="node_title" value="Nó" />
|
||||
<floater.string name="mesh_title" value="Malha" />
|
||||
<floater.string name="skin_title" value="Esqueleto" />
|
||||
<layout_stack name="main_layout">
|
||||
<layout_panel name="transforms_panel">
|
||||
<menu_button name="clipboard_pos_btn" tool_tip="Opções de colagem" />
|
||||
<text name="label position" tool_tip="Posição (metros)">
|
||||
Posição (m)
|
||||
</text>
|
||||
<menu_button name="clipboard_size_btn" tool_tip="Opções de colagem" />
|
||||
<text name="label size" tool_tip="Escala (metros)">
|
||||
Escala (m)
|
||||
</text>
|
||||
<menu_button name="clipboard_rot_btn" tool_tip="Opções de colagem" />
|
||||
<text name="label rotation" tool_tip="Rotação (graus)">
|
||||
Rotação (°)
|
||||
</text>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</floater>
|
||||
@@ -33,16 +33,4 @@
|
||||
<text label="S" name="floater_map_south" text="S">
|
||||
S
|
||||
</text>
|
||||
<text label="SE" name="floater_map_southeast" text="SE">
|
||||
SE
|
||||
</text>
|
||||
<text label="NE" name="floater_map_northeast" text="NE">
|
||||
NE
|
||||
</text>
|
||||
<text label="SO" name="floater_map_southwest" text="SO">
|
||||
SO
|
||||
</text>
|
||||
<text label="NO" name="floater_map_northwest" text="NO">
|
||||
NO
|
||||
</text>
|
||||
</floater>
|
||||
</floater>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="floater_new_feature_notification" title="NOVA FUNCIONALIDADE">
|
||||
<floater.string name="title_txt_inventory">
|
||||
Novos recursos do Inventário
|
||||
</floater.string>
|
||||
<floater.string name="description_txt_inventory">
|
||||
Agora você pode marcar itens e pastas como favoritos. Os itens favoritos aparecerão na aba Favoritos do Inventário e, por padrão, serão destacados com uma estrela na visualização principal.
|
||||
</floater.string>
|
||||
<text name="title_txt">
|
||||
Nova funcionalidade
|
||||
</text>
|
||||
<text name="description_txt">
|
||||
Descrição da funcionalidade
|
||||
</text>
|
||||
<button label="Entendi" name="close_btn" />
|
||||
</floater>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" ?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="floater_people" title="PESSOAS">
|
||||
<panel_container name="main_panel">
|
||||
<panel label="Perfil do grupo" name="panel_group_info_sidetray"/>
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="performance" title="MELHORAR O DESEMPENHO GRÁFICO">
|
||||
<string name="fps_text" value="quadros por segundo"/>
|
||||
<string name="max_text" value=" (máximo)"/>
|
||||
<panel name="panel_top">
|
||||
<panel name="fps_subpanel">
|
||||
<text name="fps_lbl">quadros por segundo</text>
|
||||
<text name="fps_desc1_lbl">Aguarde de 5 a 10 segundos</text>
|
||||
<text name="fps_desc2_lbl">para que as alterações sejam aplicadas.</text>
|
||||
</panel>
|
||||
</panel>
|
||||
<panel name="panel_performance_main">
|
||||
<panel name="autoadjustments_subpanel">
|
||||
<text name="auto_adj_lbl">Ajuste automático das configurações (recomendado)</text>
|
||||
<text name="auto_adj_desc">Permita o ajuste automático para alcançar a taxa de quadros desejada.</text>
|
||||
</panel>
|
||||
<panel name="settings_subpanel">
|
||||
<text name="settings_lbl">Configurações gráficas</text>
|
||||
<text name="settings_desc">Ajuste distância de renderização, água, iluminação e muito mais.</text>
|
||||
</panel>
|
||||
<panel name="nearby_subpanel">
|
||||
<text name="avatars_nearby_lbl">Avatares próximos</text>
|
||||
<text name="avatars_nearby_desc">Controle a exibição completa dos avatares próximos.</text>
|
||||
</panel>
|
||||
<panel name="complexity_subpanel">
|
||||
<text name="complexity_lbl">Complexidade do seu avatar</text>
|
||||
<text name="complexity_info">Reduza a complexidade do seu avatar se o FPS atual não estiver satisfatório.</text>
|
||||
</panel>
|
||||
<panel name="huds_subpanel">
|
||||
<text name="huds_lbl" width="135">HUDs ativos</text>
|
||||
<text name="huds_desc" width="395">Remover HUDs não utilizados pode melhorar o desempenho.</text>
|
||||
</panel>
|
||||
</panel>
|
||||
</floater>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="snapshot_guide_settings" title="Configurações do guia de captura">
|
||||
<text name="color_and_appearance_label">
|
||||
Cor e aparência do guia
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="Sound Preview" title="Sound.Wav">
|
||||
<text name="name_label">
|
||||
Name:
|
||||
Nome:
|
||||
</text>
|
||||
<text name="description_label">
|
||||
Descricao:
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<floater name="gui_preview_tool" title="Ferramenta de Visualização de XUI">
|
||||
<string name="ExternalEditorNotSet">
|
||||
Selecione um editor definindo a variável de ambiente LL_XUI_EDITOR
|
||||
ou a configuração ExternalEditor
|
||||
ou especificando seu caminho no campo "Caminho do Editor".
|
||||
</string>
|
||||
|
||||
<panel name="main_panel">
|
||||
<text name="select_language_label">
|
||||
Idioma principal:
|
||||
</text>
|
||||
|
||||
<combo_box name="language_select_combo">
|
||||
<combo_box.item label="en" name="item1" value="en"/>
|
||||
</combo_box>
|
||||
|
||||
<button label="Exibir" label_selected="Exibir" name="display_floater" tool_tip="Exibe o floater XUI definido pelo arquivo XML selecionado"/>
|
||||
<button label="Ocultar" label_selected="Ocultar" name="close_displayed_floater" tool_tip="Fecha o floater exibido atualmente, se existir."/>
|
||||
<button label="Editar..." label_selected="Editar..." name="edit_floater" tool_tip="Edita o floater XUI definido pelo arquivo XML selecionado (abre um editor externo). Abre a versão em inglês caso não exista uma versão localizada."/>
|
||||
<button label="Salvar" label_selected="Salvar" name="save_floater" tool_tip="Salva o floater XUI definido pelo arquivo XML selecionado"/>
|
||||
<button label="Salvar Tudo" label_selected="Salvar Tudo" name="save_all_floaters" tool_tip="Salva todos os floaters XUI definidos para o idioma selecionado"/>
|
||||
<button label="> >" label_selected="< <" name="toggle_overlap_panel" tool_tip="Alterna o destaque e o painel de exibição de elementos sobrepostos. Clique com o botão direito em um elemento para selecioná-lo para esta funcionalidade. O elemento selecionado será marcado com um retângulo vermelho."/>
|
||||
|
||||
<text name="select_language_label_2">
|
||||
Idioma secundário:
|
||||
</text>
|
||||
|
||||
<combo_box name="language_select_combo_2">
|
||||
<combo_box.item label="en" name="item1" value="en" />
|
||||
</combo_box>
|
||||
|
||||
<button label="Exibir" name="display_floater_2" tool_tip="Exibe o floater XUI definido pelo arquivo XML selecionado"/>
|
||||
<button label="Ocultar" name="close_displayed_floater_2" tool_tip="Fecha o floater exibido atualmente, se existir."/>
|
||||
<button label="Exportar Esquema" name="export_schema"/>
|
||||
<button label="Atualizar" name="refresh_btn"/>
|
||||
|
||||
<check_box label="Mostrar retângulos" name="show_rectangles"/>
|
||||
<scroll_list label="Nome" name="name_list">
|
||||
<scroll_list.columns label="Título" name="title_column"/>
|
||||
<scroll_list.columns label="Arquivo" name="file_column"/>
|
||||
<scroll_list.columns label="Nó de nível superior" name="top_level_node_column"/>
|
||||
</scroll_list>
|
||||
|
||||
<panel name="editor_panel">
|
||||
<text name="editor_path_label">
|
||||
Caminho do editor:
|
||||
</text>
|
||||
|
||||
<line_editor name="executable_path_field" tool_tip="Caminho completo para um editor (executável) usado para editar arquivos XML de floaters (aspas não são necessárias)."/>
|
||||
|
||||
<button label="Procurar..." label_selected="Procurar..." name="browse_for_executable" tool_tip="Procurar um editor (executável) para editar arquivos XML de floaters"/>
|
||||
|
||||
<text name="executable_args_label">
|
||||
Argumentos do editor:
|
||||
</text>
|
||||
|
||||
<line_editor name="executable_args_field" tool_tip="Argumentos da linha de comando do editor. Use '%FILE%' para referenciar o arquivo alvo. 'SeuPrograma.exe NomeDoArquivo.xml' será executado se este campo estiver vazio."/>
|
||||
</panel>
|
||||
|
||||
<panel name="vlt_panel">
|
||||
<text name="diff_file_label">
|
||||
Arquivo delta:
|
||||
</text>
|
||||
|
||||
<line_editor name="vlt_diff_path_field" tool_tip="Caminho completo para um arquivo XML de diferenças de localização D0 ou D1 gerado pelo Localization Toolkit."/>
|
||||
<button label="Procurar..." label_selected="Procurar..." name="browse_for_vlt_diffs" tool_tip="Procurar um arquivo de diferenças D0 ou D1 gerado pelo VLT para destacar arquivos e elementos modificados."/>
|
||||
<button label="Destacar diferenças" label_selected="Não destacar diferenças" name="toggle_vlt_diff_highlight" tool_tip="Destaca arquivos e elementos que contêm dados de localização modificados."/>
|
||||
</panel>
|
||||
</panel>
|
||||
|
||||
<scroll_container name="overlap_scroll">
|
||||
<panel name="overlap_dummy_panel">
|
||||
<overlap_panel label="Painel de Sobreposição" name="overlap_panel" tool_tip="Este painel exibe o elemento atualmente selecionado e todos os elementos que o sobrepõem, separados por linhas horizontais."/>
|
||||
|
||||
<text name="overlap_panel_label">
|
||||
Elementos sobrepostos:
|
||||
</text>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</floater>
|
||||
@@ -79,7 +79,7 @@
|
||||
Micro
|
||||
</string>
|
||||
<string name="effect_Mini">
|
||||
Mini
|
||||
Pequeno
|
||||
</string>
|
||||
<string name="effect_Model">
|
||||
Modelo
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<context_menu name="Classifieds">
|
||||
<menu_item_call label="Info" name="classified_info"/>
|
||||
<menu_item_call label="Informações" name="classified_info" />
|
||||
<menu_item_call label="Editar" name="classified_edit"/>
|
||||
<menu_item_call label="Teleportar" name="classified_teleport"/>
|
||||
<menu_item_call label="Mapa" name="classified_map"/>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu name="Copy Paste Color Menu">
|
||||
<menu_item_call label="Copiar" name="params_copy"/>
|
||||
<menu_item_call label="Colar" name="params_paste"/>
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Copy Paste Features Menu">
|
||||
<menu_item_call name="params_copy" label="Copiar" />
|
||||
<menu_item_call name="params_paste" label="Colar" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Copy Paste Light Menu">
|
||||
<menu_item_call name="params_copy" label="Copiar" />
|
||||
<menu_item_call name="params_paste" label="Colar" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Copy Paste Object Menu">
|
||||
<menu_item_call name="params_copy" label="Copiar" />
|
||||
<menu_item_call name="params_paste" label="Colar" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Copy Paste Position Menu">
|
||||
<menu_item_call name="psr_copy" label="Copiar tudo" />
|
||||
<menu_item_call name="pos_copy" label="Copiar posição" />
|
||||
<menu_item_call name="psr_paste" label="Colar tudo" />
|
||||
<menu_item_call name="pos_paste" label="Colar posição" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Copy Paste Rotation Menu">
|
||||
<menu_item_call name="psr_copy" label="Copiar tudo" />
|
||||
<menu_item_call name="rot_copy" label="Copiar rotação" />
|
||||
<menu_item_call name="psr_paste" label="Colar tudo" />
|
||||
<menu_item_call name="rot_paste" label="Colar rotação" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Copy Paste Size Menu">
|
||||
<menu_item_call name="psr_copy" label="Copiar tudo" />
|
||||
<menu_item_call name="size_copy" label="Copiar tamanho" />
|
||||
<menu_item_call name="psr_paste" label="Colar tudo" />
|
||||
<menu_item_call name="size_paste" label="Colar tamanho" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Copy Paste Texture Menu">
|
||||
<menu_item_call name="params_copy" label="Copiar" />
|
||||
<menu_item_call name="params_paste" label="Colar" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="menu_view_default">
|
||||
<menu_item_check name="sort_by_name" label="Ordenar por nome" />
|
||||
<menu_item_check name="sort_by_recent" label="Ordenar por mais recentes" />
|
||||
<menu_item_check name="sort_folders_by_name" label="Sempre ordenar pastas por nome" />
|
||||
<menu_item_check name="sort_system_folders_to_top" label="Pastas do sistema no topo" />
|
||||
<menu_item_check name="list_view" label="Visualização em lista" />
|
||||
<menu_item_check name="gallery_view" label="Visualização em galeria" />
|
||||
<menu_item_check name="combination_view" label="Visualização combinada" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="menu_font_size">
|
||||
<menu_item_check name="font_small" label="Pequeno" />
|
||||
<menu_item_check name="font_monospace" label="Monoespaçado (padrão)" />
|
||||
<menu_item_check name="font_medium" label="Médio" />
|
||||
<menu_item_check name="font_large" label="Grande" />
|
||||
<menu_item_check name="font_huge" label="Enorme" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Avatar Profile Menu">
|
||||
<menu_item_call name="im" label="Mensagem instantânea (IM)" />
|
||||
<menu_item_call name="offer_teleport" label="Oferecer teleporte" />
|
||||
<menu_item_call name="request_teleport" label="Solicitar teleporte" />
|
||||
<menu_item_call name="voice_call" label="Chamada de voz" />
|
||||
<menu_item_call name="chat_history" label="Histórico de chat" />
|
||||
<menu_item_call name="add_friend" label="Adicionar amigo" />
|
||||
<menu_item_call name="remove_friend" label="Remover amigo" />
|
||||
<menu_item_call name="invite_to_group" label="Convidar para grupo..." />
|
||||
<menu_item_call name="agent_permissions" label="Permissões do agente" />
|
||||
<menu_item_call name="map" label="Mapa" />
|
||||
<menu_item_call name="share" label="Compartilhar" />
|
||||
<menu_item_call name="pay" label="Pagar" />
|
||||
<menu_item_check name="block_unblock" label="Bloquear/Desbloquear" />
|
||||
<menu_item_call name="copy_display_name" label="Copiar nome de exibição" />
|
||||
<menu_item_call name="copy_name" label="Copiar nome do avatar" />
|
||||
<menu_item_call name="copy_id" label="Copiar ID do agente" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="Avatar Profile Menu Self">
|
||||
<menu_item_call name="edit_display_name" label="Editar nome de exibição" />
|
||||
<menu_item_call name="edit_partner" label="Editar parceiro" />
|
||||
<menu_item_call name="upload_photo" label="Enviar foto" />
|
||||
<menu_item_call name="change_photo" label="Alterar foto" />
|
||||
<menu_item_call name="remove_photo" label="Remover foto" />
|
||||
<menu_item_call name="copy_display_name" label="Copiar nome de exibição" />
|
||||
<menu_item_call name="copy_name" label="Copiar nome do avatar" />
|
||||
<menu_item_call name="copy_id" label="Copiar ID do agente" />
|
||||
</toggleable_menu>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<toggleable_menu name="menu_teleport_history_timezone">
|
||||
<menu_item_check name="teleport_history_tz_utc" label="UTC" />
|
||||
<menu_item_check name="teleport_history_tz_slt" label="SLT" />
|
||||
<menu_item_check name="teleport_history_tz_local" label="Local" />
|
||||
</toggleable_menu>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" ?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<menu_bar name="Main Menu">
|
||||
<menu label="Avatar" name="Me">
|
||||
<menu_item_call label="Conta" name="Manage Account">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<notifications>
|
||||
<global name="skipnexttime">
|
||||
Não mostre novamente
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel label="Vendas de terreno" name="panel_dir_land">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel label="Locais" name="panel_dir_places">
|
||||
<string name="searching_text">
|
||||
Buscando...
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_flickr_account">
|
||||
<string name="flickr_connected" value="Você está conectado ao Flickr como:"/>
|
||||
<string name="flickr_disconnected" value="Não conectado ao Flickr."/>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="contact_sets_panel">
|
||||
<panel.string name="empty_list">
|
||||
Este conjunto de contatos está vazio.
|
||||
@@ -10,7 +10,7 @@
|
||||
Todos os conjuntos de contatos
|
||||
</panel.string>
|
||||
<panel.string name="pseudonyms">
|
||||
Aliases
|
||||
Apelidos
|
||||
</panel.string>
|
||||
<panel.string name="non_friends">
|
||||
Não-amigos
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
Modo:
|
||||
</text>
|
||||
<combo_box name="mode_combo" tool_tip="Escolha o estilo de viewer que você conhece melhor para ajustar os padrões às suas necessidades.">
|
||||
<combo_box.item label="Hybrid" name="Hybrid"/>
|
||||
<combo_box.item label="Hibrido" name="Hybrid"/>
|
||||
<combo_box.item label="Texto" name="Text"/>
|
||||
</combo_box>
|
||||
</layout_panel>
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
Configurações gráficas
|
||||
</text>
|
||||
<text name="quality_lbl">
|
||||
Qualidade vs. velocidade
|
||||
Qualidade ou velocidade
|
||||
</text>
|
||||
<text name="FasterText">
|
||||
Rápido
|
||||
</text>
|
||||
<text name="BetterText">
|
||||
Qualidade
|
||||
Melhor qualidade
|
||||
</text>
|
||||
<text name="ShadersPrefText">
|
||||
Baixo
|
||||
@@ -28,10 +28,10 @@
|
||||
Ultra
|
||||
</text>
|
||||
<text name="quality_desc">
|
||||
Selecionar uma predefinição redefine todos os ajustes manuais.
|
||||
Escolher uma predefinição redefine todas as alterações manuais.
|
||||
</text>
|
||||
<text name="distance_lbl">
|
||||
Distância de visibilidade
|
||||
Campo de visão
|
||||
</text>
|
||||
<text name="faster_lbl">
|
||||
Rápido
|
||||
@@ -40,36 +40,36 @@
|
||||
Mais longe
|
||||
</text>
|
||||
<text name="distance_desc1">
|
||||
Mantenha baixo para melhor desempenho; aumente para ver mais longe.
|
||||
Mantenha baixo para melhor desempenho. Aumente para ver mais longe.
|
||||
</text>
|
||||
<text name="environment_lbl">
|
||||
Ambiente
|
||||
</text>
|
||||
<text name="enhancements_desc">
|
||||
Reduzir ou remover sombras pode aumentar bastante o FPS,
|
||||
mas afeta o ambiente e a aparência da cena.
|
||||
Reduzir/remover sombras pode aumentar a taxa de quadros,
|
||||
mas afeta a atmosfera e o visual da cena.
|
||||
</text>
|
||||
<text name="RenderShadowDetailText">
|
||||
Fontes de sombra:
|
||||
Fonte das sombras:
|
||||
</text>
|
||||
<combo_box name="ShadowDetail">
|
||||
<combo_box.item label="Nenhuma" name="0" />
|
||||
<combo_box.item label="Sol/Lua" name="1" />
|
||||
<combo_box.item label="Sol/Lua + projetores" name="2" />
|
||||
<combo_box.item label="Sol/Lua + Projetores" name="2" />
|
||||
</combo_box>
|
||||
<text name="water_lbl">
|
||||
Água
|
||||
</text>
|
||||
<text name="water_desc">
|
||||
Reduzir a qualidade da água pode aumentar bastante o FPS.
|
||||
Reduzir a qualidade dos efeitos da água melhora o desempenho.
|
||||
</text>
|
||||
<text name="ReflectionsText">
|
||||
Reflexos da água:
|
||||
Reflexos na água:
|
||||
</text>
|
||||
<combo_box name="Reflections">
|
||||
<combo_box.item label="Nenhum (opaco)" name="-2" />
|
||||
<combo_box.item label="Nenhum (transparente)" name="-1" />
|
||||
<combo_box.item label="Minimal" name="0" />
|
||||
<combo_box.item label="Mínimo" name="0" />
|
||||
<combo_box.item label="Terreno e árvores" name="1" />
|
||||
<combo_box.item label="Todos os objetos estáticos" name="2" />
|
||||
<combo_box.item label="Todos os avatares e objetos" name="3" />
|
||||
@@ -83,5 +83,5 @@ Fotógrafos precisam de alta qualidade,
|
||||
geralmente com custo de desempenho. As ferramentas
|
||||
de foto podem ajudar a encontrar o equilíbrio ideal.
|
||||
</text>
|
||||
<button name="open_phototools" label="Ferramentas de foto" tool_tip="Abre ferramentas de foto dedicadas para ajustes avançados." />
|
||||
<button name="open_phototools" label="Ferramentas de foto" tool_tip="Abre ferramentas avançadas de fotografia para ajustar a imagem." />
|
||||
</panel>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_hide_beacon">
|
||||
<button name="hide_beacon_btn" label="Ocultar beacon" tool_tip="Parar o rastreamento e ocultar o beacon" />
|
||||
</panel>
|
||||
@@ -6,5 +6,5 @@
|
||||
<panel label="im_header" name="im_header">
|
||||
<text name="time_box" value="23:30"/>
|
||||
</panel>
|
||||
<button label="Antworten" name="reply"/>
|
||||
<button label="Responder" name="reply"/>
|
||||
</panel>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="gallery_item_panel">
|
||||
<text name="item_name">Nome do item, nome da pasta.</text>
|
||||
</panel>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_login">
|
||||
<panel.string name="forgot_password_url">
|
||||
https://accounts.secondlife.com/forgot_password/?lang=pt-BR
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_login">
|
||||
<panel.string name="forgot_password_url">
|
||||
https://accounts.secondlife.com/forgot_password/?lang=pt-BR
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel name="Outfit Gallery">
|
||||
<string name="outfit_photo_string">
|
||||
Foto do outfit "[OUTFIT_NAME]"
|
||||
Foto do look "[OUTFIT_NAME]"
|
||||
</string>
|
||||
<string name="no_outfits_msg">
|
||||
Você ainda não tem outfits. Experimente a [secondlife:///app/search/all/ busca].
|
||||
Você ainda não tem looks. Tente [secondlife:///app/search/all/ a busca].
|
||||
</string>
|
||||
<string name="no_matched_outfits_msg">
|
||||
Não encontrou o que procura? Experimente a [secondlife:///app/search/all/[SEARCH_TERM] busca].
|
||||
Não encontrou o que procurava? Tente [secondlife:///app/search/all/[SEARCH_TERM] a busca].
|
||||
</string>
|
||||
<text name="no_outfits_txt">
|
||||
Buscando...
|
||||
</text>
|
||||
<panel name="bottom_panel">
|
||||
<menu_button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
|
||||
<menu_button name="options_gear_btn" tool_tip="Opções"/>
|
||||
<text name="OutfitcountText">
|
||||
[COUNT] Outfits
|
||||
[COUNT] looks
|
||||
</text>
|
||||
<text name="avatar_complexity_label">
|
||||
Complexidade: [WEIGHT]
|
||||
</text>
|
||||
<button name="trash_btn" tool_tip="Excluir outfit selecionado"/>
|
||||
<button name="trash_btn" tool_tip="Excluir look selecionado"/>
|
||||
</panel>
|
||||
</panel>
|
||||
</panel>
|
||||
@@ -1,17 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="Outfits">
|
||||
<accordion name="outfits_accordion">
|
||||
<no_matched_tabs_text name="no_matched_outfits_msg" value="Não encontrou o que procura? Experimente a [secondlife:///app/search/all/[SEARCH_TERM] busca]."/>
|
||||
<no_visible_tabs_text name="no_outfits_msg" value="Você ainda não tem outfits. Experimente a [secondlife:///app/search/all/ busca]."/>
|
||||
<no_matched_tabs_text name="no_matched_outfits_msg" value="Não encontrou o que procura? Tente a [secondlife:///app/search/all/[SEARCH_TERM] busca]."/>
|
||||
<no_visible_tabs_text name="no_outfits_msg" value="Você ainda não tem looks. Tente a [secondlife:///app/search/all/ busca]."/>
|
||||
</accordion>
|
||||
<panel name="bottom_panel">
|
||||
<menu_button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
|
||||
<menu_button name="options_gear_btn" tool_tip="Mostrar opções"/>
|
||||
<text name="OutfitcountText">
|
||||
[COUNT] Outfits
|
||||
[COUNT] looks
|
||||
</text>
|
||||
<text name="avatar_complexity_label">
|
||||
Complexidade: [WEIGHT]
|
||||
</text>
|
||||
<button name="trash_btn" tool_tip="Excluir outfit selecionado"/>
|
||||
<button name="trash_btn" tool_tip="Excluir look selecionado"/>
|
||||
</panel>
|
||||
</panel>
|
||||
</panel>
|
||||
@@ -1,10 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="Wearing">
|
||||
<panel.string name="no_attachments">
|
||||
Nenhum anexo vestido.
|
||||
Nenhum objeto anexado.
|
||||
</panel.string>
|
||||
<accordion name="wearables_accordion">
|
||||
<accordion_tab name="tab_wearables" title="Itens vestíveis"/>
|
||||
<accordion_tab name="tab_wearables" title="Roupas"/>
|
||||
<accordion_tab name="tab_temp_attachments" title="Anexos temporários"/>
|
||||
</accordion>
|
||||
<panel name="bottom_panel">
|
||||
@@ -13,4 +13,4 @@
|
||||
Complexidade: [WEIGHT]
|
||||
</text>
|
||||
</panel>
|
||||
</panel>
|
||||
</panel>
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_performance_autoadjustments">
|
||||
<text name="back_lbl">Voltar</text>
|
||||
<text name="settings_title">Ajuste automático de configurações</text>
|
||||
|
||||
<button name="defaults_btn" label="Restaurar configurações recomendadas" />
|
||||
|
||||
<text name="targetfps_desc">Taxa de quadros desejada</text>
|
||||
|
||||
<spinner name="target_fps" tool_tip="O viewer tentará atingir isso ajustando suas configurações gráficas." />
|
||||
|
||||
<text name="display_desc">Seu monitor suporta até [FPS_LIMIT] fps.</text>
|
||||
|
||||
<text name="settings_desc">As configurações afetam</text>
|
||||
|
||||
<combo_box.item name="av_only" label="Somente avatares" />
|
||||
<combo_box.item name="av_and_scene" label="Avatares e mundo" />
|
||||
<combo_box.item name="scene_only" label="Somente mundo" />
|
||||
|
||||
<button name="start_autotune" label="Iniciar ajuste automático" tool_tip="O viewer ajustará as configurações para atingir o FPS alvo e então parará." />
|
||||
|
||||
<button name="stop_autotune" label="Cancelar" tool_tip="Parar ajuste das configurações." />
|
||||
|
||||
<text name="wip_desc">Processando...</text>
|
||||
|
||||
<check_box name="AutoTuneContinuous" label="Ajuste contínuo" tool_tip="O viewer ajustará continuamente as configurações para manter o FPS alvo, mesmo com a janela fechada." />
|
||||
|
||||
<radio_item name="one_session_lock" label="Somente esta sessão de login" />
|
||||
<radio_item name="next_session_lock" label="Próximas sessões de login" />
|
||||
|
||||
<check_box name="vsync" label="Ativar VSync" tool_tip="Ativa a sincronização vertical para reduzir cortes e travamentos na imagem." />
|
||||
|
||||
<text name="vsync_desc">Sincroniza a taxa de atualização do monitor com o FPS.</text>
|
||||
|
||||
<text name="vsync_desc_limit">Nota: Ativar VSync limita o FPS a [FPS_LIMIT].</text>
|
||||
|
||||
<text name="simplify_dist_desc">Reduzir o nível de detalhe de avatares distantes melhora o desempenho gráfico.</text>
|
||||
|
||||
<check_box name="AutoTuneImpostorByDistEnabled" label="Simplificar avatares além de" tool_tip="Quando ativado, ajusta MaxNonImpostors para limitar avatares totalmente renderizados dentro do raio definido." />
|
||||
|
||||
<text name="dist_meters">metros</text>
|
||||
|
||||
<text name="dist_limits_desc">Escolha o intervalo de distância que será afetado pelo ajuste automático.</text>
|
||||
|
||||
<text name="min_dist_lbl">Distância mínima</text>
|
||||
<text name="pref_dist_lbl">Distância máxima</text>
|
||||
</panel>
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_performance_autotune">
|
||||
<text name="back_lbl">Voltar</text>
|
||||
<text name="settings_title">Configurações de autoajuste</text>
|
||||
|
||||
<text name="quality_lbl">Avatares distantes</text>
|
||||
|
||||
<check_box name="FSAutoTuneImpostorByDistEnabled" label="Otimização por distância" tool_tip="Quando ativado, ajusta MaxNonImpostors para limitar avatares totalmente renderizados dentro do raio definido." />
|
||||
|
||||
<spinner name="ffa_autotune" label="Avatar mais distante complexo" />
|
||||
|
||||
<text name="distant_av_advice">
|
||||
Avatares mais distantes podem ser otimizados automaticamente, independentemente do custo de renderização. Defina a distância da câmera a partir da qual um avatar será otimizado. Observação: esta configuração define MaxNonImpostors como 1 se não houver avatar por perto.
|
||||
</text>
|
||||
|
||||
<text name="distance_lbl">Limite de distância para ajuste</text>
|
||||
|
||||
<spinner name="min_dd_autotune" label="Distância mínima" />
|
||||
<spinner name="pref_dd_autotune" label="Distância preferida" />
|
||||
|
||||
<text name="distance_desc1">
|
||||
Ao ajustar os parâmetros da cena, o autoajuste escolherá valores entre a distância mínima e a distância preferida.
|
||||
</text>
|
||||
|
||||
<text name="sundry_lbl">Configurações diversas</text>
|
||||
|
||||
<check_box name="alow_self_impostor" label="Permitir otimização do próprio avatar" tool_tip="Quando ativado, o viewer pode exibir seu próprio avatar como impostor." />
|
||||
|
||||
<check_box name="show_tuned_art" label="Mostrar tempo de renderização otimizado" tool_tip="Quando ativado, a coluna de tempo mostra o tempo de renderização atual, e não o tempo anterior à otimização." />
|
||||
|
||||
<text name="sundry_desc1">
|
||||
Essas opções controlam ajustes mais avançados. Consulte a ajuda online para mais detalhes sobre cada uma.
|
||||
</text>
|
||||
</panel>
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_performance_complexity">
|
||||
<text name="back_lbl">Voltar</text>
|
||||
|
||||
<text name="attachments_title">Complexidade dos anexos do avatar</text>
|
||||
|
||||
<text name="tot_att_count">Total: 50 (120000,10 μs)</text>
|
||||
|
||||
<text name="attachments_desc1">
|
||||
Anexos tornam o avatar mais complexo e mais lento para renderizar.
|
||||
</text>
|
||||
|
||||
<text name="attachments_desc2">
|
||||
Esta tela exibe todos os anexos do seu avatar.
|
||||
</text>
|
||||
|
||||
<text name="attachments_desc3">
|
||||
Você pode remover seus próprios anexos facilmente clicando em "X".
|
||||
</text>
|
||||
|
||||
<name_list.columns name="art_value" label="Tempo (μs)" tool_tip="Tempo necessário para renderizar este anexo (microssegundos)" />
|
||||
|
||||
<name_list.columns name="complex_value" label="ARC" tool_tip="Complexidade do item (ARC)" />
|
||||
|
||||
<name_list.columns name="name" label="Nome do anexo" tool_tip="Clique em "X" para desanexar" />
|
||||
</panel>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<panel name="panel_performance_huds">
|
||||
<text name="back_lbl">Voltar</text>
|
||||
|
||||
<text name="huds_title">Seus HUDs ativos</text>
|
||||
|
||||
<text name="huds_desc1">
|
||||
Desanexar HUDs que você não usa economiza memória e pode deixar o viewer mais rápido.
|
||||
</text>
|
||||
|
||||
<text name="huds_desc2">
|
||||
HUDs geralmente têm muitos scripts e também contribuem para o lag no servidor.
|
||||
</text>
|
||||
|
||||
<text name="huds_desc3">
|
||||
Nota: minimizar o HUD não o desanexa. Use o "X" para removê-lo.
|
||||
</text>
|
||||
|
||||
<name_list.columns name="art_value" label="Tempo (μs)" tool_tip="Tempo necessário para renderizar este HUD (microssegundos)" />
|
||||
|
||||
<name_list.columns name="name" label="Nome" tool_tip="Clique em "X" para desanexar" />
|
||||
</panel>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user