llcolorswatch.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcolorswatch.cpp
  3.  * @brief LLColorSwatch class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. // File include
  34. #include "llcolorswatch.h"
  35. // Linden library includes
  36. #include "v4color.h"
  37. #include "llwindow.h" // setCursor()
  38. // Project includes
  39. #include "llui.h"
  40. #include "llrender.h"
  41. #include "lluiconstants.h"
  42. #include "llviewercontrol.h"
  43. #include "llbutton.h"
  44. #include "lltextbox.h"
  45. #include "llfloatercolorpicker.h"
  46. #include "llviewborder.h"
  47. #include "llviewertexturelist.h"
  48. #include "llfocusmgr.h"
  49. static LLDefaultChildRegistry::Register<LLColorSwatchCtrl> r("color_swatch");
  50. LLColorSwatchCtrl::Params::Params()
  51. : color("color", LLColor4::white),
  52. can_apply_immediately("can_apply_immediately", false),
  53. alpha_background_image("alpha_background_image"),
  54. border_color("border_color"),
  55.     label_width("label_width", -1),
  56. caption_text("caption_text"),
  57. border("border")
  58. {
  59. name = "colorswatch";
  60. }
  61. LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p)
  62. : LLUICtrl(p),
  63. mValid( TRUE ),
  64. mColor(p.color),
  65. mCanApplyImmediately(p.can_apply_immediately),
  66. mAlphaGradientImage(p.alpha_background_image),
  67. mOnCancelCallback(p.cancel_callback()),
  68. mOnSelectCallback(p.select_callback()),
  69. mBorderColor(p.border_color()),
  70. mLabelWidth(p.label_width)
  71. {
  72. LLTextBox::Params tp = p.caption_text;
  73. // label_width is specified, not -1
  74. if(mLabelWidth!= -1)
  75. {
  76. tp.rect(LLRect( 0, BTN_HEIGHT_SMALL, mLabelWidth, 0 ));
  77. }
  78. else
  79. {
  80. tp.rect(LLRect( 0, BTN_HEIGHT_SMALL, getRect().getWidth(), 0 ));
  81. }
  82. tp.initial_value(p.label());
  83. mCaption = LLUICtrlFactory::create<LLTextBox>(tp);
  84. addChild( mCaption );
  85. LLRect border_rect = getLocalRect();
  86. border_rect.mTop -= 1;
  87. border_rect.mRight -=1;
  88. border_rect.mBottom += BTN_HEIGHT_SMALL;
  89. LLViewBorder::Params params = p.border;
  90. params.rect(border_rect);
  91. mBorder = LLUICtrlFactory::create<LLViewBorder> (params);
  92. addChild(mBorder);
  93. }
  94. LLColorSwatchCtrl::~LLColorSwatchCtrl ()
  95. {
  96. // parent dialog is destroyed so we are too and we need to cancel selection
  97. LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
  98. if (pickerp)
  99. {
  100. pickerp->cancelSelection();
  101. pickerp->closeFloater();
  102. }
  103. }
  104. BOOL LLColorSwatchCtrl::handleDoubleClick(S32 x, S32 y, MASK mask)
  105. {
  106. return handleMouseDown(x, y, mask);
  107. }
  108. BOOL LLColorSwatchCtrl::handleHover(S32 x, S32 y, MASK mask)
  109. {
  110. getWindow()->setCursor(UI_CURSOR_HAND);
  111. return TRUE;
  112. }
  113. BOOL LLColorSwatchCtrl::handleUnicodeCharHere(llwchar uni_char)
  114. {
  115. if( ' ' == uni_char )
  116. {
  117. showPicker(TRUE);
  118. }
  119. return LLUICtrl::handleUnicodeCharHere(uni_char);
  120. }
  121. // forces color of this swatch and any associated floater to the input value, if currently invalid
  122. void LLColorSwatchCtrl::setOriginal(const LLColor4& color)
  123. {
  124. mColor = color;
  125. LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
  126. if (pickerp)
  127. {
  128. pickerp->setOrigRgb(mColor.mV[VRED], mColor.mV[VGREEN], mColor.mV[VBLUE]);
  129. }
  130. }
  131. void LLColorSwatchCtrl::set(const LLColor4& color, BOOL update_picker, BOOL from_event)
  132. {
  133. mColor = color; 
  134. LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
  135. if (pickerp && update_picker)
  136. {
  137. pickerp->setCurRgb(mColor.mV[VRED], mColor.mV[VGREEN], mColor.mV[VBLUE]);
  138. }
  139. if (!from_event)
  140. {
  141. setControlValue(mColor.getValue());
  142. }
  143. }
  144. void LLColorSwatchCtrl::setLabel(const std::string& label)
  145. {
  146. mCaption->setText(label);
  147. }
  148. BOOL LLColorSwatchCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
  149. {
  150. // Route future Mouse messages here preemptively.  (Release on mouse up.)
  151. // No handler is needed for capture lost since this object has no state that depends on it.
  152. gFocusMgr.setMouseCapture( this );
  153. return TRUE;
  154. }
  155. BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
  156. {
  157. // We only handle the click if the click both started and ended within us
  158. if( hasMouseCapture() )
  159. {
  160. // Release the mouse
  161. gFocusMgr.setMouseCapture( NULL );
  162. // If mouseup in the widget, it's been clicked
  163. if ( pointInView(x, y) )
  164. {
  165. llassert(getEnabled());
  166. llassert(getVisible());
  167. showPicker(FALSE);
  168. }
  169. }
  170. return TRUE;
  171. }
  172. // assumes GL state is set for 2D
  173. void LLColorSwatchCtrl::draw()
  174. {
  175. F32 alpha = getDrawContext().mAlpha;
  176. mBorder->setKeyboardFocusHighlight(hasFocus());
  177. // Draw border
  178. LLRect border( 0, getRect().getHeight(), getRect().getWidth(), BTN_HEIGHT_SMALL );
  179. gl_rect_2d( border, mBorderColor.get(), FALSE );
  180. LLRect interior = border;
  181. interior.stretch( -1 );
  182. // Check state
  183. if ( mValid )
  184. {
  185. // Draw the color swatch
  186. gl_rect_2d_checkerboard( interior );
  187. gl_rect_2d(interior, mColor, TRUE);
  188. LLColor4 opaque_color = mColor;
  189. opaque_color.mV[VALPHA] = 1.f;
  190. gGL.color4fv(opaque_color.mV);
  191. if (mAlphaGradientImage.notNull())
  192. {
  193. gGL.pushMatrix();
  194. {
  195. mAlphaGradientImage->draw(interior, mColor);
  196. }
  197. gGL.popMatrix();
  198. }
  199. }
  200. else
  201. {
  202. if (!mFallbackImageName.empty())
  203. {
  204. LLPointer<LLViewerFetchedTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, 
  205. LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
  206. if( fallback_image->getComponents() == 4 )
  207. {
  208. gl_rect_2d_checkerboard( interior );
  209. }
  210. gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), fallback_image, LLColor4::white % alpha);
  211. fallback_image->addTextureStats( (F32)(interior.getWidth() * interior.getHeight()) );
  212. }
  213. else
  214. {
  215. // Draw grey and an X
  216. gl_rect_2d(interior, LLColor4::grey % alpha, TRUE);
  217. gl_draw_x(interior, LLColor4::black % alpha);
  218. }
  219. }
  220. LLUICtrl::draw();
  221. }
  222. void LLColorSwatchCtrl::setEnabled( BOOL enabled )
  223. {
  224. mCaption->setEnabled( enabled );
  225. LLView::setEnabled( enabled );
  226. if (!enabled)
  227. {
  228. LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
  229. if (pickerp)
  230. {
  231. pickerp->cancelSelection();
  232. pickerp->closeFloater();
  233. }
  234. }
  235. }
  236. void LLColorSwatchCtrl::setValue(const LLSD& value)
  237. {
  238. set(LLColor4(value), TRUE, TRUE);
  239. }
  240. //////////////////////////////////////////////////////////////////////////////
  241. // called (infrequently) when the color changes so the subject of the swatch can be updated.
  242. void LLColorSwatchCtrl::onColorChanged ( void* data, EColorPickOp pick_op )
  243. {
  244. LLColorSwatchCtrl* subject = ( LLColorSwatchCtrl* )data;
  245. if ( subject )
  246. {
  247. LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)subject->mPickerHandle.get();
  248. if (pickerp)
  249. {
  250. // move color across from selector to internal widget storage
  251. LLColor4 updatedColor ( pickerp->getCurR (), 
  252. pickerp->getCurG (), 
  253. pickerp->getCurB (), 
  254. subject->mColor.mV[VALPHA] ); // keep current alpha
  255. subject->mColor = updatedColor;
  256. subject->setControlValue(updatedColor.getValue());
  257. if (pick_op == COLOR_CANCEL && subject->mOnCancelCallback)
  258. {
  259. subject->mOnCancelCallback( subject, LLSD());
  260. }
  261. else if (pick_op == COLOR_SELECT && subject->mOnSelectCallback)
  262. {
  263. subject->mOnSelectCallback( subject, LLSD() );
  264. }
  265. else
  266. {
  267. // just commit change
  268. subject->onCommit ();
  269. }
  270. }
  271. }
  272. }
  273. // This is called when the main floatercustomize panel is closed.
  274. // Since this class has pointers up to its parents, we need to cleanup
  275. // this class first in order to avoid a crash.
  276. void LLColorSwatchCtrl::onParentFloaterClosed()
  277. {
  278. LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
  279. if (pickerp)
  280. {
  281. pickerp->setSwatch(NULL);
  282. pickerp->closeFloater();
  283. }
  284. mPickerHandle.markDead();
  285. }
  286. void LLColorSwatchCtrl::setValid(BOOL valid )
  287. {
  288. mValid = valid;
  289. LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
  290. if (pickerp)
  291. {
  292. pickerp->setActive(valid);
  293. }
  294. }
  295. void LLColorSwatchCtrl::showPicker(BOOL take_focus)
  296. {
  297. LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
  298. if (!pickerp)
  299. {
  300. pickerp = new LLFloaterColorPicker(this, mCanApplyImmediately);
  301. //gFloaterView->getParentFloater(this)->addDependentFloater(pickerp);
  302. mPickerHandle = pickerp->getHandle();
  303. }
  304. // initialize picker with current color
  305. pickerp->initUI ( mColor.mV [ VRED ], mColor.mV [ VGREEN ], mColor.mV [ VBLUE ] );
  306. // display it
  307. pickerp->showUI ();
  308. if (take_focus)
  309. {
  310. pickerp->setFocus(TRUE);
  311. }
  312. }