diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml index 2dbe1679ae98985da97f001a0d9f56775d656966..316aaed96848290bf67fad2d288f820b8fdb2776 100644 --- a/indra/newview/app_settings/settings_alchemy.xml +++ b/indra/newview/app_settings/settings_alchemy.xml @@ -1237,6 +1237,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ShowPropertiesFloaters</key> + <map> + <key>Comment</key> + <string>Shows item properties in a floater rather than the sidebar</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <boolean>1</boolean> + </map> <key>ShowStatusBarFPS</key> <map> <key>Comment</key> diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 188cbc06d05d68fbc0d0ef01e693693e525122ac..b9380105840cab17a16865081ca0f971ac3614bd 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -39,6 +39,7 @@ #include "llcheckboxctrl.h" #include "llcombobox.h" #include "llavataractions.h" +#include "llcombobox.h" #include "llinventorydefines.h" #include "llinventoryobserver.h" #include "llinventorymodel.h" @@ -57,6 +58,7 @@ #include "llviewercontrol.h" #include "llviewerwindow.h" #include "llgroupactions.h" +#include "llslurl.h" #include "lluictrlfactory.h" @@ -95,32 +97,84 @@ class LLPropertiesObserver : public LLInventoryObserver void LLPropertiesObserver::changed(U32 mask) { // if there's a change we're interested in. - if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) + if ((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) { - mFloater->dirty(); + const std::set<LLUUID>& idItems = gInventory.getChangedIDs(); + for (const LLUUID& id : idItems) + { + if (mFloater->getItemID() == id) + mFloater->dirty(); + } } } +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLObjectPropertiesObserver +// +// Helper class to watch for changes in an object inventory. +// Used to update item properties in LLFloaterProperties. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLObjectPropertiesObserver : public LLVOInventoryListener +{ +public: + LLObjectPropertiesObserver(LLFloaterProperties* floater, LLViewerObject* object) + : mFloater(floater) + { + registerVOInventoryListener(object, NULL); + } + + /*virtual*/ ~LLObjectPropertiesObserver() + { + removeVOInventoryListener(); + } + + /*virtual*/ void inventoryChanged(LLViewerObject* object, LLInventoryObject::object_list_t* inventory, S32 serial_num, void* user_data) + { + mFloater->dirty(); + } +private: + LLFloaterProperties* mFloater; +}; ///---------------------------------------------------------------------------- /// Class LLFloaterProperties ///---------------------------------------------------------------------------- // Default constructor -LLFloaterProperties::LLFloaterProperties(const LLUUID& item_id) - : LLFloater(mItemID), - mItemID(item_id), - mDirty(TRUE) +LLFloaterProperties::LLFloaterProperties(const LLSD& key) + : LLFloater(key) + , mDirty(TRUE) + , mPropertiesObserver(NULL) + , mObjectPropertiesObserver(NULL) { - mPropertiesObserver = new LLPropertiesObserver(this); + if (key.has("item_id")) + { + mItemID = key["item_id"].asUUID(); + if (key.has("object_id")) + mObjectID = key["object_id"].asUUID(); + } + + if (mObjectID.isNull()) + mPropertiesObserver = new LLPropertiesObserver(this); + else + mObjectPropertiesObserver = new LLObjectPropertiesObserver(this, gObjectList.findObject(mObjectID)); } // Destroys the object LLFloaterProperties::~LLFloaterProperties() { - delete mPropertiesObserver; - mPropertiesObserver = NULL; + if (mPropertiesObserver) + { + delete mPropertiesObserver; + mPropertiesObserver = NULL; + } + + if (mObjectPropertiesObserver) + { + delete mObjectPropertiesObserver; + mObjectPropertiesObserver = NULL; + } } // virtual @@ -132,10 +186,6 @@ BOOL LLFloaterProperties::postBuild() getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this)); getChild<LLLineEditor>("LabelItemDesc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this)); - // Creator information - getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this)); - // owner information - getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickOwner,this)); // acquired date // owner permissions // Permissions debug text @@ -155,6 +205,8 @@ BOOL LLFloaterProperties::postBuild() // The UI has been built, now fill in all the values refresh(); + setTitle(llformat("%s %s", getTitle().c_str(), getString( (mObjectID.notNull()) ? "origin_inworld" : "origin_inventory").c_str())); + return TRUE; } @@ -182,9 +234,7 @@ void LLFloaterProperties::refresh() "LabelItemName", "LabelItemDesc", "LabelCreatorName", - "BtnCreator", "LabelOwnerName", - "BtnOwner", "CheckOwnerModify", "CheckOwnerCopy", "CheckOwnerTransfer", @@ -279,9 +329,8 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) if (item->getCreatorUUID().notNull()) { - LLAvatarName av_name; - LLAvatarNameCache::get(item->getCreatorUUID(), &av_name); - getChildView("BtnCreator")->setEnabled(TRUE); + const LLUUID& creator_id = item->getCreatorUUID(); + std::string name = LLSLURL("agent", creator_id, "inspect").getSLURLString(); getChildView("LabelCreatorTitle")->setEnabled(TRUE); getChildView("LabelCreatorName")->setEnabled(TRUE); // [RLVa:KB] - Checked: RLVa-2.0.1 @@ -289,19 +338,13 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) if ( (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, item->getCreatorUUID())) && ( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == item->getCreatorUUID()) ) || (RlvUtil::isNearbyAgent(item->getCreatorUUID())) ) ) { - childSetEnabled("BtnCreator", FALSE); - getChild<LLUICtrl>("LabelCreatorName")->setValue(RlvStrings::getAnonym(av_name.getUserName())); - } - else - { - getChild<LLUICtrl>("LabelCreatorName")->setValue(av_name.getUserName()); + name = RlvStrings::getAnonym(name); } // [/RLVa:KB] -// getChild<LLUICtrl>("LabelCreatorName")->setValue(av_name.getUserName()); + getChild<LLUICtrl>("LabelCreatorName")->setValue(name); } else { - getChildView("BtnCreator")->setEnabled(FALSE); getChildView("LabelCreatorTitle")->setEnabled(FALSE); getChildView("LabelCreatorName")->setEnabled(FALSE); getChild<LLUICtrl>("LabelCreatorName")->setValue(getString("unknown")); @@ -318,13 +361,13 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) std::string name; if (perm.isGroupOwned()) { - gCacheName->getGroupName(perm.getGroup(), name); + const LLUUID& group_id = perm.getGroup(); + name = LLSLURL("group", group_id, "inspect").getSLURLString(); } else { - LLAvatarName av_name; - LLAvatarNameCache::get(perm.getOwner(), &av_name); - name = av_name.getUserName(); + const LLUUID& owner_id = perm.getOwner(); + name = LLSLURL("agent", owner_id, "inspect").getSLURLString(); // [RLVa:KB] - Checked: RLVa-2.0.1 if (RlvActions::isRlvEnabled()) { @@ -334,17 +377,12 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) } // [/RLVa:KB] } -// getChildView("BtnOwner")->setEnabled(TRUE); -// [RLVa:KB] - Checked: RLVa-2.0.1 - getChildView("BtnOwner")->setEnabled(fRlvCanShowOwner); -// [/RLVa:KB] getChildView("LabelOwnerTitle")->setEnabled(TRUE); getChildView("LabelOwnerName")->setEnabled(TRUE); getChild<LLUICtrl>("LabelOwnerName")->setValue(name); } else { - getChildView("BtnOwner")->setEnabled(FALSE); getChildView("LabelOwnerTitle")->setEnabled(FALSE); getChildView("LabelOwnerName")->setEnabled(FALSE); getChild<LLUICtrl>("LabelOwnerName")->setValue(getString("public")); @@ -564,46 +602,6 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item) } } -void LLFloaterProperties::onClickCreator() -{ - LLInventoryItem* item = findItem(); - if(!item) return; - if(!item->getCreatorUUID().isNull()) - { -// [RLVa:KB] - Checked: RLVa-1.2.1 - const LLUUID& idCreator = item->getCreatorUUID(); - if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, idCreator)) ) - { - const LLPermissions& perm = item->getPermissions(); - if ( ((perm.isOwned()) && (!perm.isGroupOwned()) && (perm.getOwner() == idCreator) ) || (RlvUtil::isNearbyAgent(idCreator)) ) - { - return; - } - } -// [/RLVa:KB] - LLAvatarActions::showProfile(item->getCreatorUUID()); - } -} - -// static -void LLFloaterProperties::onClickOwner() -{ - LLInventoryItem* item = findItem(); - if(!item) return; - if(item->getPermissions().isGroupOwned()) - { - LLGroupActions::show(item->getPermissions().getGroup()); - } - else - { -// [RLVa:KB] - Checked: RLVa-1.0.0 - if ( (RlvActions::isRlvEnabled()) && (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, item->getPermissions().getOwner())) ) - return; -// [/RLVa:KB] - LLAvatarActions::showProfile(item->getPermissions().getOwner()); - } -} - // static void LLFloaterProperties::onCommitName() { @@ -921,7 +919,7 @@ LLMultiProperties::LLMultiProperties() { // start with a small rect in the top-left corner ; will get resized LLRect rect; - rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20); + rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 350, 300); setRect(rect); LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup("properties"); if (last_floater) diff --git a/indra/newview/llfloaterproperties.h b/indra/newview/llfloaterproperties.h index 755d37a10789f56882d11104745aeabcf56ba309..49fd4ac76805caba735b4fdec0042728fd36a478 100644 --- a/indra/newview/llfloaterproperties.h +++ b/indra/newview/llfloaterproperties.h @@ -43,26 +43,27 @@ class LLRadioGroup; class LLTextBox; class LLPropertiesObserver; +class LLObjectPropertiesObserver; class LLFloaterProperties final : public LLFloater { public: - LLFloaterProperties(const LLUUID& item_id); + LLFloaterProperties(const LLSD& key); /*virtual*/ ~LLFloaterProperties(); /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); - void setObjectID(const LLUUID& object_id) { mObjectID = object_id; } void dirty() { mDirty = TRUE; } void refresh(); static void dirtyAll(); + const LLUUID& getItemID() const { return mItemID; } + const LLUUID& getObjectID() const { return mObjectID; } + protected: // ui callbacks - void onClickCreator(); - void onClickOwner(); void onCommitName(); void onCommitDescription(); void onCommitPermissions(); @@ -87,6 +88,7 @@ class LLFloaterProperties final : public LLFloater BOOL mDirty; LLPropertiesObserver* mPropertiesObserver; + LLObjectPropertiesObserver* mObjectPropertiesObserver; }; class LLMultiProperties final : public LLMultiFloater diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index efa459bdd5e54d00d119220ff0d1e3c0cd2f7922..cdec0552cb048d59f9b89d4dfc203f5d9e693665 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1003,8 +1003,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id, addDeleteContextMenuOptions(items, disabled_items); - // If multiple items are selected, disable properties (if it exists). - if ((flags & FIRST_SELECTED_ITEM) == 0) + // If multiple items are selected, only disable properties if we're not showing them in a multi-floater + if ( ((flags & FIRST_SELECTED_ITEM) == 0) && (!gSavedSettings.getBOOL("ShowPropertiesFloaters")) ) { disabled_items.push_back(std::string("Properties")); } diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 9bbedb02246d6aec3cbb66fca97dff52ad33222a..2d09f80a4aabb4a80bd519c76ac09cc7d276dc01 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -829,13 +829,19 @@ BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id) void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id) { - LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", item_uuid).with("object", object_id)); + if (gSavedSettings.getBOOL("ShowPropertiesFloaters")) + LLFloaterReg::showInstance("properties", LLSD().with("item_id", item_uuid).with("object_id", object_id)); + else + LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", item_uuid).with("object", object_id)); } void show_item_profile(const LLUUID& item_uuid) { LLUUID linked_uuid = gInventory.getLinkedItemID(item_uuid); - LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", linked_uuid)); + if (gSavedSettings.getBOOL("ShowPropertiesFloaters")) + LLFloaterReg::showInstance("properties", LLSD().with("item_id", item_uuid)); + else + LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", linked_uuid)); } void show_item_original(const LLUUID& item_uuid) @@ -2653,7 +2659,8 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root } } - else if (("task_properties" == action || "properties" == action) && selected_items.size() > 1) + else if ( ("task_properties" == action || "properties" == action) && (selected_items.size() > 1) && + (gSavedSettings.getBOOL("ShowPropertiesFloaters")) ) { multi_propertiesp = new LLMultiProperties(); gFloaterView->addChild(multi_propertiesp); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 657d79d8d724c92205a1f7981e51c38292e48f49..484e48817b6ac53c66ce2b2aa2c21521a44b6978 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -637,7 +637,8 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags) // [/RLVa:KB] } items.push_back(std::string("Task Properties")); - if ((flags & FIRST_SELECTED_ITEM) == 0) + // If multiple items are selected, only disable properties if we're not showing them in a multi-floater + if ( ((flags & FIRST_SELECTED_ITEM) == 0) && (!gSavedSettings.getBOOL("ShowPropertiesFloaters")) ) { disabled_items.push_back(std::string("Task Properties")); } diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml index 935acb691873affa500ad8f0e3c3b430fa853965..0bd62198c000188ba55a4a5582823ef7cdea0fdf 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - height="340" + height="260" layout="topleft" name="item properties" help_topic="item_properties" save_rect="true" - title="INVENTORY ITEM PROPERTIES" - width="350"> + title="ITEM PROPERTIES" + width="375"> <floater.string name="unknown"> (unknown) @@ -28,6 +28,14 @@ name="acquiredDate"> [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </floater.string> + <floater.string + name="origin_inventory"> + (Inventory) + </floater.string> + <floater.string + name="origin_inworld"> + (Inworld) + </floater.string> <icon follows="top|right" height="18" @@ -47,20 +55,20 @@ left="10" name="LabelItemNameTitle" top="25" - width="78"> + width="80"> Name: </text> <line_editor border_style="line" border_thickness="1" follows="left|top|right" - height="16" + height="18" layout="topleft" - left_delta="78" + left_pad="0" max_length_bytes="63" name="LabelItemName" - top_delta="0" - width="252" /> + right="-10" + top_delta="-2" /> <text type="string" length="1" @@ -70,20 +78,20 @@ left="10" name="LabelItemDescTitle" top="45" - width="78"> + width="80"> Description: </text> <line_editor border_style="line" border_thickness="1" follows="left|top|right" - height="16" + height="18" layout="topleft" - left_delta="78" + left_pad="0" max_length_bytes="127" name="LabelItemDesc" - top_delta="0" - width="252" /> + right="-10" + top_delta="-2" /> <text type="string" length="1" @@ -93,7 +101,7 @@ left="10" name="LabelCreatorTitle" top="65" - width="78"> + width="80"> Creator: </text> <text @@ -102,23 +110,14 @@ follows="left|top" height="16" layout="topleft" - left_delta="78" + left_pad="0" name="LabelCreatorName" + right="-10" top_delta="0" translate="false" - use_ellipses="true" - width="170"> + use_ellipses="true"> TestString PleaseIgnore </text> - <button - follows="top|right" - height="16" - label="Profile..." - layout="topleft" - left_delta="174" - name="BtnCreator" - top_delta="0" - width="78" /> <text type="string" length="1" @@ -128,7 +127,7 @@ left="10" name="LabelOwnerTitle" top="85" - width="78"> + width="80"> Owner: </text> <text @@ -137,23 +136,14 @@ follows="left|top" height="16" layout="topleft" - left_delta="78" + left_pad="0" name="LabelOwnerName" + right="-10" top_delta="0" translate="false" - use_ellipses="true" - width="170"> + use_ellipses="true"> TestString PleaseIgnore </text> - <button - follows="top|right" - height="16" - label="Profile..." - layout="topleft" - left_delta="174" - name="BtnOwner" - top_delta="0" - width="78" /> <text type="string" length="1" @@ -163,7 +153,7 @@ left="10" name="LabelAcquiredTitle" top="105" - width="78"> + width="80"> Acquired: </text> <text @@ -172,10 +162,10 @@ follows="left|top" height="16" layout="topleft" - left_delta="78" + left_pad="0" name="LabelAcquiredDate" - top_delta="0" - width="252"> + right="-10" + top_delta="0"> Wed May 24 12:50:46 2006 </text> <text @@ -187,41 +177,31 @@ left="10" name="OwnerLabel" top="125" - width="78"> + width="80"> You: </text> <check_box height="16" - label="Edit" + label="Modify" layout="topleft" - left_pad="5" + left_pad="0" name="CheckOwnerModify" top_delta="0" - width="78" /> + width="80" /> <check_box height="16" label="Copy" layout="topleft" - left_delta="0" + left_pad="5" name="CheckOwnerCopy" - top_pad="5" - width="88" /> + width="80" /> <check_box height="16" - label="Resell" + label="Transfer" layout="topleft" - left_delta="0" + left_pad="5" name="CheckOwnerTransfer" - top_pad="5" - width="106" /> - <check_box - height="16" - label="Export" - layout="topleft" - left_delta="0" - name="CheckOwnerExport" - top_pad="5" - width="106" /> + width="80" /> <text type="string" length="1" @@ -231,14 +211,14 @@ left="10" name="AnyoneLabel" top_pad="5" - width="78"> + width="80"> Anyone: </text> <check_box height="16" label="Copy" layout="topleft" - left_pad="5" + left_pad="0" name="CheckEveryoneCopy" top_delta="0" width="130" /> @@ -251,16 +231,16 @@ left="10" name="GroupLabel" top_pad="5" - width="78"> + width="80"> Group: </text> <check_box height="16" label="Share" layout="topleft" - left_pad="5" + left_pad="0" name="CheckShareWithGroup" - top_delta="5" + top_delta="0" width="106" /> <text type="string" @@ -271,110 +251,42 @@ left="10" name="NextOwnerLabel" top_pad="5" - width="78" + width="80" word_wrap="true"> Next owner: </text> <check_box height="16" - label="Edit" + label="Modify" layout="topleft" - left_pad="5" + left_pad="0" name="CheckNextOwnerModify" top_delta="0" - width="78" /> + width="80" /> <check_box height="16" label="Copy" layout="topleft" - left_delta="0" + left_pad="5" name="CheckNextOwnerCopy" - top_pad="5" - width="88" /> - <check_box - height="16" - label="Resell" - layout="topleft" - left_delta="0" - name="CheckNextOwnerTransfer" - top_pad="5" - width="106" /> + width="80" /> <check_box height="16" - label="For Sale" - layout="topleft" - left="10" - name="CheckPurchase" - top_pad="5" - width="78" /> - <combo_box - height="19" - left_pad="5" - layout="topleft" - follows="left|top" - name="ComboBoxSaleType" - width="110"> - <combo_box.item - name="Copy" - label="Copy" - value="2" /> - <combo_box.item - name="Contents" - label="Contents" - value="3" /> - <combo_box.item - name="Original" - label="Original" - value="1" /> - </combo_box> - <spinner - follows="left|top" - decimal_digits="0" - increment="1" - control_name="Edit Cost" - name="Edit Cost" - label="Price:" - label_width="100" - left="10" - width="192" - min_val="1" - height="19" - max_val="999999999" - top_pad="5"/> - <text - type="string" - length="1" - height="15" - follows="left|top" - layout="topleft" - left_delta="82" - name="CurrencySymbol" - top_delta="1" - width="18"> - L$ - </text> - - <!--line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="16" + label="Transfer" layout="topleft" left_pad="5" - max_length_bytes="25" - name="EditPrice" - top_delta="0" - width="242" /--> + name="CheckNextOwnerTransfer" + width="80" /> - <!--text + <text type="string" length="1" follows="left|top" height="10" layout="topleft" - left="10" + left="30" name="BaseMaskDebug" - top="155" + top_pad="5" width="330"> B: </text> @@ -425,6 +337,48 @@ top_delta="0" width="90"> N: - </text--> + </text> + <check_box + height="16" + label="For Sale" + layout="topleft" + left="20" + name="CheckPurchase" + top_pad="12" + width="100" /> + <spinner + follows="left|top" + decimal_digits="0" + increment="1" + control_name="Edit Cost" + name="Edit Cost" + label="L$" + label_width="15" + left_pad="10" + width="100" + min_val="1" + height="19" + max_val="999999999" + top_delta="-2"/> + <combo_box + height="19" + left_pad="5" + layout="topleft" + follows="left|top" + name="ComboBoxSaleType" + width="110"> + <combo_box.item + name="Copy" + label="Copy" + value="2" /> + <combo_box.item + name="Contents" + label="Contents" + value="3" /> + <combo_box.item + name="Original" + label="Original" + value="1" /> + </combo_box> </floater>