00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/setup_video.h"
00023
00024 #include "gui/ok_dialog.h"
00025
00026 #include "gui/widgets/checkbox.h"
00027 #include "gui/widgets/label.h"
00028 #include "gui/widgets/layouthelper.h"
00029 #include "gui/widgets/listbox.h"
00030 #include "gui/widgets/scrollarea.h"
00031 #include "gui/widgets/slider.h"
00032 #include "gui/widgets/textfield.h"
00033 #include "gui/widgets/dropdown.h"
00034
00035 #include "configuration.h"
00036 #include "engine.h"
00037 #include "graphics.h"
00038 #include "localplayer.h"
00039 #include "log.h"
00040 #include "main.h"
00041 #include "particle.h"
00042
00043 #include "utils/gettext.h"
00044 #include "utils/stringutils.h"
00045
00046 #include <guichan/key.hpp>
00047 #include <guichan/listmodel.hpp>
00048
00049 #include <SDL.h>
00050 #include <string>
00051 #include <vector>
00052
00053 extern Graphics *graphics;
00054
00060 class ModeListModel : public gcn::ListModel
00061 {
00062 public:
00066 ModeListModel();
00067
00071 virtual ~ModeListModel() { }
00072
00076 int getNumberOfElements() { return mVideoModes.size(); }
00077
00081 std::string getElementAt(int i) { return mVideoModes[i]; }
00082
00083 private:
00084 std::vector<std::string> mVideoModes;
00085 };
00086
00087 ModeListModel::ModeListModel()
00088 {
00089
00090 SDL_Rect **modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
00091
00092
00093 if (modes == (SDL_Rect **)0)
00094 logger->log("No modes available");
00095 else if (modes == (SDL_Rect **)-1)
00096 logger->log("All resolutions available");
00097 else
00098 {
00099
00100 for (int i = 0; modes[i]; ++i)
00101 {
00102 const std::string modeString =
00103 toString((int)modes[i]->w) + "x" + toString((int)modes[i]->h);
00104
00105 mVideoModes.push_back(modeString);
00106 }
00107 }
00108 }
00109
00110 const char *SIZE_NAME[4] =
00111 {
00112 N_("Small"),
00113 N_("Medium"),
00114 N_("Large"),
00115 N_("Very Large")
00116 };
00117
00118 class FontSizeChoiceListModel : public gcn::ListModel
00119 {
00120 public:
00121 virtual ~FontSizeChoiceListModel() { }
00122
00123 virtual int getNumberOfElements()
00124 {
00125 return 4;
00126 }
00127
00128 virtual std::string getElementAt(int i)
00129 {
00130 if (i >= getNumberOfElements())
00131 return _("???");
00132
00133 return SIZE_NAME[i];
00134 }
00135 };
00136
00137 Setup_Video::Setup_Video():
00138 mFullScreenEnabled(config.getValue("screen", false)),
00139 mOpenGLEnabled(config.getValue("opengl", false)),
00140 mCustomCursorEnabled(config.getValue("customcursor", true)),
00141 mVisibleNamesEnabled(config.getValue("visiblenames", true)),
00142 mParticleEffectsEnabled(config.getValue("particleeffects", true)),
00143 mNameEnabled(config.getValue("showownname", false)),
00144 mPickupChatEnabled(config.getValue("showpickupchat", true)),
00145 mPickupParticleEnabled(config.getValue("showpickupparticle", false)),
00146 mOpacity(config.getValue("guialpha", 0.8)),
00147 mFps((int) config.getValue("fpslimit", 60)),
00148 mSpeechMode((int) config.getValue("speech", 3)),
00149 mModeListModel(new ModeListModel),
00150 mModeList(new ListBox(mModeListModel)),
00151 mFsCheckBox(new CheckBox(_("Full screen"), mFullScreenEnabled)),
00152 mOpenGLCheckBox(new CheckBox(_("OpenGL"), mOpenGLEnabled)),
00153 mCustomCursorCheckBox(new CheckBox(_("Custom cursor"), mCustomCursorEnabled)),
00154 mVisibleNamesCheckBox(new CheckBox(_("Visible names"), mVisibleNamesEnabled)),
00155 mParticleEffectsCheckBox(new CheckBox(_("Particle effects"), mParticleEffectsEnabled)),
00156 mNameCheckBox(new CheckBox(_("Show name"), mNameEnabled)),
00157 mPickupNotifyLabel(new Label(_("Show pickup notification"))),
00158 mPickupChatCheckBox(new CheckBox(_("in chat"), mPickupChatEnabled)),
00159 mPickupParticleCheckBox(new CheckBox(_("as particle"),
00160 mPickupParticleEnabled)),
00161 mSpeechSlider(new Slider(0, 3)),
00162 mSpeechLabel(new Label("")),
00163 mAlphaSlider(new Slider(0.2, 1.0)),
00164 mFpsCheckBox(new CheckBox(_("FPS Limit:"))),
00165 mFpsSlider(new Slider(10, 120)),
00166 mFpsField(new TextField),
00167 mOriginalScrollLaziness((int) config.getValue("ScrollLaziness", 16)),
00168 mScrollLazinessSlider(new Slider(1, 64)),
00169 mScrollLazinessField(new TextField),
00170 mOriginalScrollRadius((int) config.getValue("ScrollRadius", 0)),
00171 mScrollRadiusSlider(new Slider(0, 128)),
00172 mScrollRadiusField(new TextField),
00173 mOverlayDetail((int) config.getValue("OverlayDetail", 2)),
00174 mOverlayDetailSlider(new Slider(0, 2)),
00175 mOverlayDetailField(new Label("")),
00176 mParticleDetail(3 - (int) config.getValue("particleEmitterSkip", 1)),
00177 mParticleDetailSlider(new Slider(0, 3)),
00178 mParticleDetailField(new Label("")),
00179 mFontSize((int) config.getValue("fontSize", 11))
00180 {
00181 setName(_("Video"));
00182
00183 ScrollArea *scrollArea = new ScrollArea(mModeList);
00184 scrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
00185
00186 speechLabel = new Label(_("Overhead text"));
00187 alphaLabel = new Label(_("Gui opacity"));
00188 scrollRadiusLabel = new Label(_("Scroll radius"));
00189 scrollLazinessLabel = new Label(_("Scroll laziness"));
00190 overlayDetailLabel = new Label(_("Ambient FX"));
00191 particleDetailLabel = new Label(_("Particle Detail"));
00192 fontSizeLabel = new Label(_("Font size"));
00193
00194 mFontSizeDropDown = new DropDown(new FontSizeChoiceListModel);
00195
00196 mModeList->setEnabled(true);
00197
00198 #ifndef USE_OPENGL
00199 mOpenGLCheckBox->setEnabled(false);
00200 #endif
00201
00202 mAlphaSlider->setValue(mOpacity);
00203 mAlphaSlider->setWidth(90);
00204
00205 mFpsField->setText(toString(mFps));
00206 mFpsField->setEnabled(mFps > 0);
00207 mFpsField->setWidth(30);
00208 mFpsSlider->setValue(mFps);
00209 mFpsSlider->setEnabled(mFps > 0);
00210 mFpsCheckBox->setSelected(mFps > 0);
00211
00212 mModeList->setActionEventId("videomode");
00213 mCustomCursorCheckBox->setActionEventId("customcursor");
00214 mVisibleNamesCheckBox->setActionEventId("visiblenames");
00215 mParticleEffectsCheckBox->setActionEventId("particleeffects");
00216 mPickupChatCheckBox->setActionEventId("pickupchat");
00217 mPickupParticleCheckBox->setActionEventId("pickupparticle");
00218 mNameCheckBox->setActionEventId("showownname");
00219 mAlphaSlider->setActionEventId("guialpha");
00220 mFpsCheckBox->setActionEventId("fpslimitcheckbox");
00221 mSpeechSlider->setActionEventId("speech");
00222 mFpsSlider->setActionEventId("fpslimitslider");
00223 mScrollRadiusSlider->setActionEventId("scrollradiusslider");
00224 mScrollRadiusField->setActionEventId("scrollradiusfield");
00225 mScrollLazinessSlider->setActionEventId("scrolllazinessslider");
00226 mScrollLazinessField->setActionEventId("scrolllazinessfield");
00227 mOverlayDetailSlider->setActionEventId("overlaydetailslider");
00228 mOverlayDetailField->setActionEventId("overlaydetailfield");
00229 mParticleDetailSlider->setActionEventId("particledetailslider");
00230 mParticleDetailField->setActionEventId("particledetailfield");
00231
00232 mModeList->addActionListener(this);
00233 mCustomCursorCheckBox->addActionListener(this);
00234 mVisibleNamesCheckBox->addActionListener(this);
00235 mParticleEffectsCheckBox->addActionListener(this);
00236 mPickupChatCheckBox->addActionListener(this);
00237 mPickupParticleCheckBox->addActionListener(this);
00238 mNameCheckBox->addActionListener(this);
00239 mAlphaSlider->addActionListener(this);
00240 mFpsCheckBox->addActionListener(this);
00241 mSpeechSlider->addActionListener(this);
00242 mFpsSlider->addActionListener(this);
00243 mFpsField->addKeyListener(this);
00244 mScrollRadiusSlider->addActionListener(this);
00245 mScrollRadiusField->addKeyListener(this);
00246 mScrollLazinessSlider->addActionListener(this);
00247 mScrollLazinessField->addKeyListener(this);
00248 mOverlayDetailSlider->addActionListener(this);
00249 mOverlayDetailField->addKeyListener(this);
00250 mParticleDetailSlider->addActionListener(this);
00251 mParticleDetailField->addKeyListener(this);
00252
00253 mScrollRadiusField->setText(toString(mOriginalScrollRadius));
00254 mScrollRadiusSlider->setValue(mOriginalScrollRadius);
00255
00256 mScrollLazinessField->setText(toString(mOriginalScrollLaziness));
00257 mScrollLazinessSlider->setValue(mOriginalScrollLaziness);
00258
00259 switch (mSpeechMode)
00260 {
00261 case 0:
00262 mSpeechLabel->setCaption(_("No text"));
00263 break;
00264 case 1:
00265 mSpeechLabel->setCaption(_("Text"));
00266 break;
00267 case 2:
00268 mSpeechLabel->setCaption(_("Bubbles, no names"));
00269 break;
00270 case 3:
00271 mSpeechLabel->setCaption(_("Bubbles with names"));
00272 break;
00273 }
00274 mSpeechSlider->setValue(mSpeechMode);
00275
00276 switch (mOverlayDetail)
00277 {
00278 case 0:
00279 mOverlayDetailField->setCaption(_("off"));
00280 break;
00281 case 1:
00282 mOverlayDetailField->setCaption(_("low"));
00283 break;
00284 case 2:
00285 mOverlayDetailField->setCaption(_("high"));
00286 break;
00287 }
00288 mOverlayDetailSlider->setValue(mOverlayDetail);
00289
00290 switch (mParticleDetail)
00291 {
00292 case 0:
00293 mParticleDetailField->setCaption(_("low"));
00294 break;
00295 case 1:
00296 mParticleDetailField->setCaption(_("medium"));
00297 break;
00298 case 2:
00299 mParticleDetailField->setCaption(_("high"));
00300 break;
00301 case 3:
00302 mParticleDetailField->setCaption(_("max"));
00303 break;
00304 }
00305 mParticleDetailSlider->setValue(mParticleDetail);
00306
00307 int fontSizeSelected;
00308 switch (mFontSize)
00309 {
00310 case 11:
00311 fontSizeSelected = 0;
00312 break;
00313 case 12:
00314 fontSizeSelected = 1;
00315 break;
00316 case 13:
00317 fontSizeSelected = 2;
00318 break;
00319 case 14:
00320 fontSizeSelected = 3;
00321 break;
00322 default:
00323 fontSizeSelected = 0;
00324 break;
00325 }
00326
00327 mFontSizeDropDown->setSelected(fontSizeSelected);
00328 mFontSizeDropDown->adjustHeight();
00329
00330
00331 LayoutHelper h(this);
00332 ContainerPlacer place = h.getPlacer(0, 0);
00333
00334 place(0, 0, scrollArea, 1, 6).setPadding(2);
00335 place(1, 0, mFsCheckBox, 2);
00336 place(3, 0, mOpenGLCheckBox, 1);
00337 place(1, 1, mCustomCursorCheckBox, 3);
00338 place(1, 2, mVisibleNamesCheckBox, 3);
00339 place(3, 2, mNameCheckBox, 1);
00340 place(1, 3, mParticleEffectsCheckBox, 3);
00341 place(1, 4, mPickupNotifyLabel, 3);
00342 place(1, 13, mPickupChatCheckBox, 1);
00343
00344 place(0, 6, mAlphaSlider);
00345 place(0, 7, mFpsSlider);
00346 place(0, 8, mScrollRadiusSlider);
00347 place(0, 9, mScrollLazinessSlider);
00348 place(0, 10, mSpeechSlider);
00349 place(0, 11, mOverlayDetailSlider);
00350 place(0, 12, mParticleDetailSlider);
00351
00352 place(1, 6, alphaLabel, 3);
00353 place(1, 7, mFpsCheckBox).setPadding(3);
00354 place(1, 8, scrollRadiusLabel);
00355 place(1, 9, scrollLazinessLabel);
00356 place(1, 10, speechLabel);
00357 place(1, 11, overlayDetailLabel);
00358 place(1, 12, particleDetailLabel);
00359 place(1, 5, fontSizeLabel, 3);
00360
00361 place(2, 5, mFontSizeDropDown, 3);
00362 place(2, 7, mFpsField).setPadding(1);
00363 place(2, 8, mScrollRadiusField).setPadding(1);
00364 place(2, 9, mScrollLazinessField).setPadding(1);
00365 place(2, 10, mSpeechLabel, 3).setPadding(2);
00366 place(2, 11, mOverlayDetailField, 3).setPadding(2);
00367 place(2, 12, mParticleDetailField, 3).setPadding(2);
00368 place(2, 13, mPickupParticleCheckBox, 2);
00369
00370 setDimension(gcn::Rectangle(0, 0, 325, 300));
00371 }
00372
00373 void Setup_Video::apply()
00374 {
00375
00376 bool fullscreen = mFsCheckBox->isSelected();
00377 if (fullscreen != (config.getValue("screen", false) == 1))
00378 {
00379
00380
00381
00382
00383
00384
00385
00386 #if defined(WIN32) || defined(__APPLE__)
00387
00388 if (!(config.getValue("opengl", false) == 1))
00389 {
00390 #endif
00391 if (!graphics->setFullscreen(fullscreen))
00392 {
00393 fullscreen = !fullscreen;
00394 if (!graphics->setFullscreen(fullscreen))
00395 {
00396 std::stringstream error;
00397 error << _("Failed to switch to ") <<
00398 (fullscreen ? _("windowed") : _("fullscreen")) <<
00399 _("mode and restoration of old mode also failed!") <<
00400 std::endl;
00401 logger->error(error.str());
00402 }
00403 }
00404 #if defined(WIN32) || defined(__APPLE__)
00405 }
00406 else
00407 {
00408 new OkDialog(_("Switching to full screen"),
00409 _("Restart needed for changes to take effect."));
00410 }
00411 #endif
00412 config.setValue("screen", fullscreen);
00413 }
00414
00415
00416 if (mOpenGLCheckBox->isSelected() != mOpenGLEnabled)
00417 {
00418 config.setValue("opengl", mOpenGLCheckBox->isSelected());
00419
00420
00421 new OkDialog(_("Changing OpenGL"),
00422 _("Applying change to OpenGL requires restart."));
00423 }
00424
00425
00426 config.setValue("fpslimit", mFps);
00427
00428 config.setValue("fontSize", mFontSizeDropDown->getSelected() + 11);
00429
00430
00431 mFullScreenEnabled = config.getValue("screen", false);
00432 mCustomCursorEnabled = config.getValue("customcursor", true);
00433 mVisibleNamesEnabled = config.getValue("visiblenames", true);
00434 mParticleEffectsEnabled = config.getValue("particleeffects", true);
00435 mNameEnabled = config.getValue("showownname", false);
00436 mSpeechMode = (int) config.getValue("speech", 3);
00437 mOpacity = config.getValue("guialpha", 0.8);
00438 mOverlayDetail = (int) config.getValue("OverlayDetail", 2);
00439 mOpenGLEnabled = config.getValue("opengl", false);
00440 mPickupChatEnabled = config.getValue("showpickupchat", true);
00441 mPickupParticleEnabled = config.getValue("showpickupparticle", false);
00442 }
00443
00444 int Setup_Video::updateSlider(gcn::Slider *slider, gcn::TextField *field,
00445 const std::string &configName)
00446 {
00447 int value;
00448 std::stringstream temp(field->getText());
00449 temp >> value;
00450 if (value < slider->getScaleStart())
00451 {
00452 value = (int) slider->getScaleStart();
00453 }
00454 else if (value > slider->getScaleEnd())
00455 {
00456 value = (int) slider->getScaleEnd();
00457 }
00458 field->setText(toString(value));
00459 slider->setValue(value);
00460 config.setValue(configName, value);
00461 return value;
00462 }
00463
00464 void Setup_Video::cancel()
00465 {
00466 mFsCheckBox->setSelected(mFullScreenEnabled);
00467 mOpenGLCheckBox->setSelected(mOpenGLEnabled);
00468 mCustomCursorCheckBox->setSelected(mCustomCursorEnabled);
00469 mVisibleNamesCheckBox->setSelected(mVisibleNamesEnabled);
00470 mParticleEffectsCheckBox->setSelected(mParticleEffectsEnabled);
00471 mSpeechSlider->setValue(mSpeechMode);
00472 mNameCheckBox->setSelected(mNameEnabled);
00473 mAlphaSlider->setValue(mOpacity);
00474 mOverlayDetailSlider->setValue(mOverlayDetail);
00475 mParticleDetailSlider->setValue(mParticleDetail);
00476
00477 mScrollRadiusField->setText(toString(mOriginalScrollRadius));
00478 mScrollLazinessField->setText(toString(mOriginalScrollLaziness));
00479 updateSlider(mScrollRadiusSlider, mScrollRadiusField, "ScrollRadius");
00480 updateSlider(mScrollLazinessSlider, mScrollLazinessField, "ScrollLaziness");
00481
00482 config.setValue("screen", mFullScreenEnabled);
00483 config.setValue("customcursor", mCustomCursorEnabled);
00484 config.setValue("visiblenames", mVisibleNamesEnabled);
00485 config.setValue("particleeffects", mParticleEffectsEnabled);
00486 config.setValue("speech", mSpeechMode);
00487 config.setValue("showownname", mNameEnabled);
00488 if (player_node)
00489 player_node->mUpdateName = true;
00490 config.setValue("guialpha", mOpacity);
00491 config.setValue("opengl", mOpenGLEnabled);
00492 config.setValue("showpickupchat", mPickupChatEnabled);
00493 config.setValue("showpickupparticle", mPickupParticleEnabled);
00494 }
00495
00496 void Setup_Video::action(const gcn::ActionEvent &event)
00497 {
00498 if (event.getId() == "videomode")
00499 {
00500 const std::string mode = mModeListModel->getElementAt(mModeList->getSelected());
00501 const int width = atoi(mode.substr(0, mode.find("x")).c_str());
00502 const int height = atoi(mode.substr(mode.find("x") + 1).c_str());
00503
00504 if (width != graphics->getWidth() || height != graphics->getHeight())
00505 {
00506
00507 new OkDialog(_("Screen resolution changed"),
00508 _("Restart your client for the change to take effect."));
00509 }
00510
00511 config.setValue("screenwidth", width);
00512 config.setValue("screenheight", height);
00513 }
00514 else if (event.getId() == "guialpha")
00515 {
00516 config.setValue("guialpha", mAlphaSlider->getValue());
00517 }
00518 else if (event.getId() == "customcursor")
00519 {
00520 config.setValue("customcursor", mCustomCursorCheckBox->isSelected());
00521 }
00522 else if (event.getId() == "visiblenames")
00523 {
00524 config.setValue("visiblenames", mVisibleNamesCheckBox->isSelected());
00525 }
00526 else if (event.getId() == "particleeffects")
00527 {
00528 config.setValue("particleeffects",
00529 mParticleEffectsCheckBox->isSelected());
00530 if (engine)
00531 {
00532 new OkDialog(_("Particle effect settings changed."),
00533 _("Changes will take effect on map change."));
00534 }
00535 }
00536 else if (event.getId() == "pickupchat")
00537 {
00538 config.setValue("showpickupchat", mPickupChatCheckBox->isSelected());
00539 }
00540 else if (event.getId() == "pickupparticle")
00541 {
00542 config.setValue("showpickupparticle",
00543 mPickupParticleCheckBox->isSelected());
00544 }
00545 else if (event.getId() == "speech")
00546 {
00547 int val = (int) mSpeechSlider->getValue();
00548 switch (val)
00549 {
00550 case 0:
00551 mSpeechLabel->setCaption(_("No text"));
00552 break;
00553 case 1:
00554 mSpeechLabel->setCaption(_("Text"));
00555 break;
00556 case 2:
00557 mSpeechLabel->setCaption(_("Bubbles, no names"));
00558 break;
00559 case 3:
00560 mSpeechLabel->setCaption(_("Bubbles with names"));
00561 break;
00562 }
00563 mSpeechSlider->setValue(val);
00564 config.setValue("speech", val);
00565 }
00566 else if (event.getId() == "showownname")
00567 {
00568
00569
00570 if (player_node)
00571 player_node->mUpdateName = true;
00572 config.setValue("showownname", mNameCheckBox->isSelected());
00573 }
00574 else if (event.getId() == "fpslimitslider")
00575 {
00576 mFps = (int) mFpsSlider->getValue();
00577 mFpsField->setText(toString(mFps));
00578 }
00579 else if (event.getId() == "scrollradiusslider")
00580 {
00581 int val = (int) mScrollRadiusSlider->getValue();
00582 mScrollRadiusField->setText(toString(val));
00583 config.setValue("ScrollRadius", val);
00584 }
00585 else if (event.getId() == "scrolllazinessslider")
00586 {
00587 int val = (int) mScrollLazinessSlider->getValue();
00588 mScrollLazinessField->setText(toString(val));
00589 config.setValue("ScrollLaziness", val);
00590 }
00591 else if (event.getId() == "overlaydetailslider")
00592 {
00593 int val = (int) mOverlayDetailSlider->getValue();
00594 switch (val)
00595 {
00596 case 0:
00597 mOverlayDetailField->setCaption(_("off"));
00598 break;
00599 case 1:
00600 mOverlayDetailField->setCaption(_("low"));
00601 break;
00602 case 2:
00603 mOverlayDetailField->setCaption(_("high"));
00604 break;
00605 }
00606 config.setValue("OverlayDetail", val);
00607 }
00608 else if (event.getId() == "particledetailslider")
00609 {
00610 int val = (int) mParticleDetailSlider->getValue();
00611 switch (val)
00612 {
00613 case 0:
00614 mParticleDetailField->setCaption(_("low"));
00615 break;
00616 case 1:
00617 mParticleDetailField->setCaption(_("medium"));
00618 break;
00619 case 2:
00620 mParticleDetailField->setCaption(_("high"));
00621 break;
00622 case 3:
00623 mParticleDetailField->setCaption(_("max"));
00624 break;
00625 }
00626 config.setValue("particleEmitterSkip", 3 - val);
00627 Particle::emitterSkip = 4 - val;
00628 }
00629 else if (event.getId() == "fpslimitcheckbox")
00630 {
00631 if (mFpsCheckBox->isSelected())
00632 {
00633 mFps = (int) mFpsSlider->getValue();
00634 }
00635 else
00636 {
00637 mFps = 0;
00638 }
00639 mFpsField->setEnabled(mFps > 0);
00640 mFpsField->setText(toString(mFps));
00641 mFpsSlider->setValue(mFps);
00642 mFpsSlider->setEnabled(mFps > 0);
00643 }
00644 }
00645
00646 void Setup_Video::keyPressed(gcn::KeyEvent &event)
00647 {
00648 std::stringstream tempFps(mFpsField->getText());
00649
00650 if (tempFps >> mFps)
00651 {
00652 if (mFps < 10)
00653 {
00654 mFps = 10;
00655 }
00656 else if (mFps > 120)
00657 {
00658 mFps = 120;
00659 }
00660 mFpsField->setText(toString(mFps));
00661 mFpsSlider->setValue(mFps);
00662 }
00663 else
00664 {
00665 mFpsField->setText("");
00666 mFps = 0;
00667 }
00668 updateSlider(mScrollRadiusSlider, mScrollRadiusField, "ScrollRadius");
00669 updateSlider(mScrollLazinessSlider, mScrollLazinessField, "ScrollLaziness");
00670 }