diff --git a/indra/llui/llscrolllistitem.cpp b/indra/llui/llscrolllistitem.cpp index 4c272d31f2c9d095f78c2cd2b066ffd7efbc3dc4..db607e99466a475c8ee391bc9a3fbbbfb6ee688d 100644 --- a/indra/llui/llscrolllistitem.cpp +++ b/indra/llui/llscrolllistitem.cpp @@ -45,6 +45,10 @@ LLScrollListItem::LLScrollListItem( const Params& p ) mUserRemovable(p.user_removable), mItemValue(p.value) { + for (const auto& cell : p.contents.columns) + addColumn(cell); + for (const auto& cell : p.columns) + addColumn(cell); } diff --git a/indra/llui/llscrolllistitem.h b/indra/llui/llscrolllistitem.h index b9c72827335e691efebb4de7141ddb49ed445277..12e41f4230004eeb5f88b58dc10e0ffba03e1577 100644 --- a/indra/llui/llscrolllistitem.h +++ b/indra/llui/llscrolllistitem.h @@ -50,6 +50,17 @@ class LLScrollListItem { friend class LLScrollListCtrl; public: + struct Contents : public LLInitParam::Block<Contents> + { + Multiple<LLScrollListCell::Params> columns; + Contents() + : columns("columns") + { + addSynonym(columns, "column"); + addSynonym(columns, "cell"); + } + }; + struct Params : public LLInitParam::Block<Params> { Optional<bool> enabled; @@ -62,6 +73,7 @@ public: Ignored length; Multiple<LLScrollListCell::Params> columns; + Optional<Contents> contents; Params() : enabled("enabled", true), @@ -70,7 +82,8 @@ public: name("name"), type("type"), length("length"), - columns("columns") + columns("columns"), + contents("contents") { addSynonym(columns, "column"); addSynonym(value, "id"); diff --git a/indra/llwindow/llwindowsdl2.cpp b/indra/llwindow/llwindowsdl2.cpp index d78715873568ebecfbc048dfa731f9fc35094e67..9ed1581272551ffa31b05cc49d7072d5e1d8bf5c 100644 --- a/indra/llwindow/llwindowsdl2.cpp +++ b/indra/llwindow/llwindowsdl2.cpp @@ -46,6 +46,8 @@ #include "SDL2/SDL_syswm.h" #if LL_WINDOWS +#include <commdlg.h> +#include <shellapi.h> #include "../newview/res/resource.h" #endif @@ -1766,8 +1768,7 @@ void LLWindowSDL2::spawnWebBrowser(const std::string& escaped_url, bool async) // reliablly on Vista. // this is madness.. no, this is.. - LLWString url_wstring = utf8str_to_wstring(escaped_url); - llutf16string url_utf16 = wstring_to_utf16str(url_wstring); + auto url_wstring = ll_convert_string_to_wide(escaped_url); // let the OS decide what to use to open the URL SHELLEXECUTEINFO sei = { sizeof(sei) }; @@ -1779,7 +1780,7 @@ void LLWindowSDL2::spawnWebBrowser(const std::string& escaped_url, bool async) } sei.nShow = SW_SHOWNORMAL; sei.lpVerb = L"open"; - sei.lpFile = url_utf16.c_str(); + sei.lpFile = url_wstring.c_str(); ShellExecuteEx(&sei); #endif } diff --git a/indra/newview/llfloatertexturepicker.cpp b/indra/newview/llfloatertexturepicker.cpp index f6e371e4bbb76480d9df0d027926d1545a2b48c5..f0edbdef00f849bbc5e5be4f551c3211465096a1 100644 --- a/indra/newview/llfloatertexturepicker.cpp +++ b/indra/newview/llfloatertexturepicker.cpp @@ -28,7 +28,6 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" -#include "llcombobox.h" #include "lldraghandle.h" #include "llfiltereditor.h" #include "llfloaterreg.h" @@ -37,6 +36,7 @@ #include "llinventorypanel.h" #include "llselectmgr.h" #include "llscrolllistctrl.h" +#include "lltabcontainer.h" #include "lltoolmgr.h" #include "lltoolpipette.h" #include "lltrans.h" @@ -111,17 +111,17 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID)) { - if ( mBakeTextureEnabled && mModeSelector->getSelectedIndex() != 2) + if ( mBakeTextureEnabled && mModeSelector->getCurrentPanelIndex() != 2) { - mModeSelector->setSelectedIndex(2, 0); + mModeSelector->selectTab(2); onModeSelect(); } } else { - if (mModeSelector->getSelectedIndex() == 2) + if (mModeSelector->getCurrentPanelIndex() == 2) { - mModeSelector->setSelectedIndex(0, 0); + mModeSelector->selectTab(0); onModeSelect(); } @@ -366,9 +366,9 @@ BOOL LLFloaterTexturePicker::postBuild() } } - mModeSelector = getChild<LLRadioGroup>("mode_selection"); + mModeSelector = getChild<LLTabContainer>("mode_selection"); mModeSelector->setCommitCallback(boost::bind(&LLFloaterTexturePicker::onModeSelect, this)); - mModeSelector->setSelectedIndex(0, 0); + mModeSelector->selectTab(0); childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this); childSetAction("l_rem_btn", LLFloaterTexturePicker::onBtnRemove, this); @@ -401,7 +401,7 @@ BOOL LLFloaterTexturePicker::postBuild() LLToolPipette::getInstance()->setToolSelectCallback(boost::bind(&LLFloaterTexturePicker::onTextureSelect, this, _1)); - getChild<LLComboBox>("l_bake_use_texture_combo_box")->setCommitCallback(onBakeTextureSelect, this); + getChild<LLUICtrl>("l_bake_use_texture_combo_box")->setCommitCallback(onBakeTextureSelect, this); getChild<LLCheckBoxCtrl>("hide_base_mesh_region")->setCommitCallback(onHideBaseMeshRegionCheck, this); setBakeTextureEnabled(FALSE); @@ -779,83 +779,12 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem void LLFloaterTexturePicker::onModeSelect() { - S32 mode = mModeSelector->getSelectedIndex(); - - getChild<LLButton>("Default")->setVisible(mode == 0); - getChild<LLButton>("Transparent")->setVisible(mode == 0); // <alchemy/> - getChild<LLButton>("Blank")->setVisible(mode == 0); - getChild<LLButton>("None")->setVisible(mode == 0); - getChild<LLButton>("Pipette")->setVisible(mode == 0); - getChild<LLFilterEditor>("inventory search editor")->setVisible(mode == 0); - getChild<LLInventoryPanel>("inventory panel")->setVisible(mode == 0); - getChild<LLLineEditor>("uuid_editor")->setVisible(mode == 0); - getChild<LLButton>("apply_uuid_btn")->setVisible(mode == 0); - - /*self->getChild<LLCheckBox>("show_folders_check")->setVisible(mode); - no idea under which conditions the above is even shown, needs testing. */ - - getChild<LLButton>("l_add_btn")->setVisible(mode == 1); - getChild<LLButton>("l_rem_btn")->setVisible(mode == 1); - getChild<LLButton>("l_upl_btn")->setVisible(mode == 1); - getChild<LLScrollListCtrl>("l_name_list")->setVisible(mode == 1); - - getChild<LLComboBox>("l_bake_use_texture_combo_box")->setVisible(mode == 2); - getChild<LLCheckBoxCtrl>("hide_base_mesh_region")->setVisible(false);// mode == 2); + S32 mode = mModeSelector->getCurrentPanelIndex(); if (mode == 2) { stopUsingPipette(); - - S8 val = -1; - - LLUUID imageID = mImageAssetID; - if (imageID == IMG_USE_BAKED_HEAD) - { - val = 0; - } - else if (imageID == IMG_USE_BAKED_UPPER) - { - val = 1; - } - else if (imageID == IMG_USE_BAKED_LOWER) - { - val = 2; - } - else if (imageID == IMG_USE_BAKED_EYES) - { - val = 3; - } - else if (imageID == IMG_USE_BAKED_SKIRT) - { - val = 4; - } - else if (imageID == IMG_USE_BAKED_HAIR) - { - val = 5; - } - else if (imageID == IMG_USE_BAKED_LEFTARM) - { - val = 6; - } - else if (imageID == IMG_USE_BAKED_LEFTLEG) - { - val = 7; - } - else if (imageID == IMG_USE_BAKED_AUX1) - { - val = 8; - } - else if (imageID == IMG_USE_BAKED_AUX2) - { - val = 9; - } - else if (imageID == IMG_USE_BAKED_AUX3) - { - val = 10; - } - - - getChild<LLComboBox>("l_bake_use_texture_combo_box")->setSelectedByValue(val, TRUE); + getChild<LLScrollListCtrl>("l_bake_use_texture_combo_box")->setSelectedByValue(mImageAssetID, TRUE); } } @@ -977,55 +906,10 @@ void LLFloaterTexturePicker::onApplyImmediateCheck(LLUICtrl* ctrl, void *user_da void LLFloaterTexturePicker::onBakeTextureSelect(LLUICtrl* ctrl, void *user_data) { LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)user_data; - LLComboBox* combo_box = (LLComboBox*)ctrl; - S8 type = combo_box->getValue().asInteger(); + auto val = ctrl->getValue(); - LLUUID imageID = self->mDefaultImageAssetID; - if (type == 0) - { - imageID = IMG_USE_BAKED_HEAD; - } - else if (type == 1) - { - imageID = IMG_USE_BAKED_UPPER; - } - else if (type == 2) - { - imageID = IMG_USE_BAKED_LOWER; - } - else if (type == 3) - { - imageID = IMG_USE_BAKED_EYES; - } - else if (type == 4) - { - imageID = IMG_USE_BAKED_SKIRT; - } - else if (type == 5) - { - imageID = IMG_USE_BAKED_HAIR; - } - else if (type == 6) - { - imageID = IMG_USE_BAKED_LEFTARM; - } - else if (type == 7) - { - imageID = IMG_USE_BAKED_LEFTLEG; - } - else if (type == 8) - { - imageID = IMG_USE_BAKED_AUX1; - } - else if (type == 9) - { - imageID = IMG_USE_BAKED_AUX2; - } - else if (type == 10) - { - imageID = IMG_USE_BAKED_AUX3; - } + LLUUID imageID = val.asUUID(); self->setImageID(imageID); self->mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? @@ -1105,7 +989,7 @@ void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string ) void LLFloaterTexturePicker::setLocalTextureEnabled(BOOL enabled) { - mModeSelector->setIndexEnabled(1,enabled); + mModeSelector->enableTabButton(1,enabled); } void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled) @@ -1113,18 +997,18 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled) BOOL changed = (enabled != mBakeTextureEnabled); mBakeTextureEnabled = enabled; - mModeSelector->setIndexEnabled(2, enabled); + mModeSelector->enableTabButton(2, enabled); - if (!mBakeTextureEnabled && (mModeSelector->getSelectedIndex() == 2)) + if (!mBakeTextureEnabled && (mModeSelector->getCurrentPanelIndex() == 2)) { - mModeSelector->setSelectedIndex(0, 0); + mModeSelector->selectTab(0); } if (changed && mBakeTextureEnabled && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID)) { - if (mModeSelector->getSelectedIndex() != 2) + if (mModeSelector->getCurrentPanelIndex() != 2) { - mModeSelector->setSelectedIndex(2, 0); + mModeSelector->selectTab(2); } } onModeSelect(); diff --git a/indra/newview/llfloatertexturepicker.h b/indra/newview/llfloatertexturepicker.h index 3ab7e9cfeec8ac590af22b243e96c17346bd1fc8..399b25d8fb78964cce744cb8250dc7fe77fc83e0 100644 --- a/indra/newview/llfloatertexturepicker.h +++ b/indra/newview/llfloatertexturepicker.h @@ -33,6 +33,7 @@ #include "llfloater.h" class LLFilterEditor; +class LLTabContainer; typedef std::function<void(LLTextureCtrl::ETexturePickOp op, LLUUID id)> floater_commit_callback; typedef std::function<void()> floater_close_callback; @@ -160,7 +161,7 @@ protected: LLSaveFolderState mSavedFolderState; BOOL mSelectedItemPinned; - LLRadioGroup* mModeSelector; + LLTabContainer* mModeSelector; LLScrollListCtrl* mLocalScrollCtrl; private: diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml index 808aaa32eb8e8b64cee41206114032c5830e0e2f..19bc3bef4b76d153b29d9937bf7264d5a5b4efca 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml @@ -47,58 +47,218 @@ Multiple textures </text> + <text + type="string" + length="1" + follows="left|top" + height="14" + layout="topleft" + left_delta="12" + name="unknown" + top_pad="80"> + Size: [DIMENSIONS] + </text> + <!-- mode selector --> - <radio_group - control_name="mode_selection" - height="20" + <tab_container + bottom="-60" layout="topleft" - left="0" - top_pad="80" + left="171" + right="-5" + top="20" name="mode_selection" - follows="left|top"> - <radio_item + follows="all"> +<!-- middle: inventory mode --> + <panel label="Inventory" name="inventory" - top_delta="20" + top="0" layout="topleft" - height="16" + follows="all" + bottom="0" left="0" - value="0" - width="70" /> - <radio_item + right="-1"> + <filter_editor + follows="left|top|right" + height="20" + label="Filter Textures" + layout="topleft" + left="0" + name="inventory search editor" + top_delta="3" + right="-1" /> + <inventory_panel + allow_multi_select="false" + bg_visible="true" + bg_alpha_color="DkGray2" + border="false" + follows="all" + height="262" + layout="topleft" + left="0" + name="inventory panel" + top_pad="4" + right="-1" /> + <check_box + visible="false" + height="0" + initial_value="false" + label="Show folders" + layout="topleft" + name="show_folders_check" + top_pad="0" + left_delta="-3" + width="0" /> + </panel> +<!-- middle: local mode --> + <panel label="Local" - left_pad="0" + left="0" layout="topleft" - top_delta="0" - height="16" + follows="all" + top="0" + bottom="0" name="local" - value="1" - width="50" /> - <radio_item + right="-1"> + <scroll_list + name="l_name_list" + left="0" + top_delta="0" + height="262" + follows="all" + column_padding="0" + draw_heading="true" + multi_select="true" + search_column="1" + right="-1"> + <column name="unit_name" label="Name" dynamicwidth="true" /> + <column name="unit_id_HIDDEN" label="ID" width="0" /> + </scroll_list> + <button + follows="left|bottom" + height="20" + label="Add" + label_selected="Add" + layout="topleft" + left="0" + top_pad="5" + name="l_add_btn" + width="74"/> + <button + enabled="false" + follows="left|bottom" + height="20" + label="Remove" + label_selected="Remove" + layout="topleft" + left_pad="5" + name="l_rem_btn" + top_delta="0" + width="74"/> + <button + enabled="false" + follows="left|bottom" + height="20" + label="Upload" + label_selected="Upload" + layout="topleft" + left_pad="5" + name="l_upl_btn" + top_delta="0" + width="74"/> + </panel> + <panel label="Bake" - left_pad="0" + left="0" layout="topleft" - top_delta="0" - height="16" + follows="all" + top="0" name="bake" - value="2" - width="50" /> - </radio_group> - <!-- --> - - <text - type="string" - length="1" + bottom="0" + right="-1"> +<!-- middle: bake mode --> + <scroll_list + left="0" + top_delta="0" + height="262" + layout="topleft" + follows="all" + name="l_bake_use_texture_combo_box" + tool_tip="Choose the bake texture" + draw_heading="true" + right="-1"> + <scroll_list.column name="type" label="Type"/> + <scroll_list.row + name="BAKED_HEAD" + value="5a9f4a74-30f2-821c-b88d-70499d3e7183"> + <column name="type" value="BAKED_HEAD"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_UPPER" + value="ae2de45c-d252-50b8-5c6e-19f39ce79317"> + <column name="type" value="BAKED_UPPER"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_LOWER" + value="24daea5f-0539-cfcf-047f-fbc40b2786ba"> + <column name="type" value="BAKED_LOWER"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_EYES" + value="52cc6bb6-2ee5-e632-d3ad-50197b1dcb8a"> + <column name="type" value="BAKED_EYES"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_SKIRT" + value="43529ce8-7faa-ad92-165a-bc4078371687"> + <column name="type" value="BAKED_SKIRT"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_HAIR" + value="09aac1fb-6bce-0bee-7d44-caac6dbb6c63"> + <column name="type" value="BAKED_HAIR"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_LEFTARM" + value="ff62763f-d60a-9855-890b-0c96f8f8cd98"> + <column name="type" value="BAKED_LEFTARM"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_LEFTLEG" + value="8e915e25-31d1-cc95-ae08-d58a47488251"> + <column name="type" value="BAKED_LEFTLEG"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_AUX1" + value="9742065b-19b5-297c-858a-29711d539043"> + <column name="type" value="BAKED_AUX1"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_AUX2" + value="03642e83-2bd1-4eb9-34b4-4c47ed586d2d"> + <column name="type" value="BAKED_AUX2"/> + </scroll_list.row> + <scroll_list.row + name="BAKED_AUX3" + value="edd51b77-fc10-ce7a-4b3d-011dfc349e4f"> + <column name="type" value="BAKED_AUX3"/> + </scroll_list.row> + </scroll_list> + <check_box follows="left|top" - height="14" + height="20" + initial_value="false" + label="Hide Base Mesh Region" layout="topleft" - left_delta="12" - name="unknown" - top_pad="4"> - Size: [DIMENSIONS] - </text> - -<!-- middle: inventory mode --> + name="hide_base_mesh_region" + left_delta="0" + top_pad="10" + top_delta="0" + width="120" + visible="false"/> + </panel> + </tab_container> + <!-- --> <button enabled="false" @@ -108,8 +268,8 @@ label_selected="Default" layout="topleft" name="Default" - width="73" - left="94" + width="80" + left="87" top="215"/> <button follows="left|top" @@ -120,7 +280,7 @@ left_delta="0" name="Transparent" top_pad="5" - width="73" /> + width="80" /> <button follows="left|top" height="20" @@ -130,9 +290,8 @@ left_delta="0" name="Blank" top_pad="5" - width="73" /> + width="80" /> <button - enabled="false" follows="left|top" height="20" label="None" @@ -141,14 +300,14 @@ left_delta="0" name="None" top_pad="5" - width="73" /> + width="80" /> <button follows="left|top" height="28" image_selected="eye_button_active.tga" image_unselected="eye_button_inactive.tga" layout="topleft" - left_delta="-80" + left_delta="-73" top_delta="-25" name="Pipette" width="28" /> @@ -162,44 +321,15 @@ value="Preview Disabled" visible="false" width="120" /> - <filter_editor - follows="left|top|right" - height="23" - label="Filter Textures" - layout="topleft" - left="175" - name="inventory search editor" - top="20" - width="231" /> - <inventory_panel - allow_multi_select="false" - bg_visible="true" - bg_alpha_color="DkGray2" - border="false" - follows="all" - height="262" - layout="topleft" - left_delta="0" - name="inventory panel" - top_pad="4" - width="231" /> - <check_box - visible="false" - height="0" - initial_value="false" - label="Show folders" - layout="topleft" - name="show_folders_check" - top_pad="0" - left_delta="-3" - width="0" /> + +<!-- bottom static --> <line_editor follows="left|bottom|right" layout="topleft" name="uuid_editor" label="Enter Texture UUID" max_length_chars="36" - top_pad="7" + top="-55" height="20" width="296" left="5" /> @@ -212,133 +342,6 @@ top_delta="0" height="20" width="100" /> - -<!-- middle: local mode --> - <button - follows="left|bottom" - height="18" - label="Add" - label_selected="Add" - layout="topleft" - left="94" - top="272" - name="l_add_btn" - width="73" - visible="false"/> - <button - enabled="false" - follows="left|bottom" - height="20" - label="Remove" - label_selected="Remove" - layout="topleft" - left_delta="0" - name="l_rem_btn" - top_pad="5" - width="73" - visible="false"/> - <button - enabled="false" - follows="left|bottom" - height="20" - label="Upload" - label_selected="Upload" - layout="topleft" - left_delta="0" - name="l_upl_btn" - top_pad="5" - width="73" - visible="false"/> - <scroll_list - name="l_name_list" - left="170" - top="20" - width="235" - height="320" - follows="left|top|right|bottom" - column_padding="0" - draw_heading="true" - multi_select="true" - search_column="1" - visible="false"> - <column name="unit_name" label="Name" dynamicwidth="true" /> - <column name="unit_id_HIDDEN" label="ID" width="0" /> - </scroll_list> - -<!-- middle: bake mode --> - <combo_box - left="180" - top="30" - height="19" - top_delta="15" - layout="topleft" - follows="left|top" - name="l_bake_use_texture_combo_box" - tool_tip="Choose the bake texture" - width="118" - visible="false"> - <combo_box.item - label="None" - name="None" - value="-1" /> - <combo_box.item - label="BAKED_HEAD" - name="BAKED_HEAD" - value="0" /> - <combo_box.item - label="BAKED_UPPER" - name="BAKED_UPPER" - value="1" /> - <combo_box.item - label="BAKED_LOWER" - name="BAKED_LOWER" - value="2" /> - <combo_box.item - label="BAKED_EYES" - name="BAKED_EYES" - value="3" /> - <combo_box.item - label="BAKED_SKIRT" - name="BAKED_SKIRT" - value="4" /> - <combo_box.item - label="BAKED_HAIR" - name="BAKED_HAIR" - value="5" /> - <combo_box.item - label="BAKED_LEFTARM" - name="BAKED_LEFTARM" - value="6" /> - <combo_box.item - label="BAKED_LEFTLEG" - name="BAKED_LEFTLEG" - value="7" /> - <combo_box.item - label="BAKED_AUX1" - name="BAKED_AUX1" - value="8" /> - <combo_box.item - label="BAKED_AUX2" - name="BAKED_AUX2" - value="9" /> - <combo_box.item - label="BAKED_AUX3" - name="BAKED_AUX3" - value="10" /> - </combo_box> - <check_box - follows="left|top" - height="20" - initial_value="false" - label="Hide Base Mesh Region" - layout="topleft" - name="hide_base_mesh_region" - left_delta="0" - top_pad="10" - top_delta="0" - width="120" - visible="false"/> -<!-- bottom static --> <button follows="bottom|right" height="20"