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_colors.h"
00023
00024 #include "gui/gui.h"
00025 #include "gui/itemlinkhandler.h"
00026 #include "gui/palette.h"
00027
00028 #include "gui/widgets/browserbox.h"
00029 #include "gui/widgets/label.h"
00030 #include "gui/widgets/layouthelper.h"
00031 #include "gui/widgets/listbox.h"
00032 #include "gui/widgets/scrollarea.h"
00033 #include "gui/widgets/slider.h"
00034 #include "gui/widgets/textpreview.h"
00035
00036 #include "configuration.h"
00037
00038 #include "utils/gettext.h"
00039 #include "utils/stringutils.h"
00040
00041 #include <string>
00042 #include <cmath>
00043
00044 const std::string Setup_Colors::rawmsg = _("This is what the color looks like");
00045
00046 Setup_Colors::Setup_Colors() :
00047 mSelected(-1)
00048 {
00049 setName(_("Colors"));
00050
00051 mColorBox = new ListBox(guiPalette);
00052 mColorBox->setActionEventId("color_box");
00053 mColorBox->addActionListener(this);
00054
00055 mScroll = new ScrollArea(mColorBox);
00056 mScroll->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
00057
00058 mTextPreview = new TextPreview(rawmsg);
00059
00060 mPreview = new BrowserBox(BrowserBox::AUTO_WRAP);
00061 mPreview->setOpaque(false);
00062
00063
00064 mPreview->setLinkHandler(NULL);
00065
00066 mPreviewBox = new ScrollArea(mPreview);
00067 mPreviewBox->setHeight(20);
00068 mPreviewBox->setScrollPolicy(gcn::ScrollArea::SHOW_NEVER,
00069 gcn::ScrollArea::SHOW_NEVER);
00070
00071 mGradTypeLabel = new Label(_("Type: "));
00072
00073 mGradTypeSlider = new Slider(0, 3);
00074 mGradTypeSlider->setWidth(200);
00075 mGradTypeSlider->setActionEventId("slider_grad");
00076 mGradTypeSlider->setValue(0);
00077 mGradTypeSlider->addActionListener(this);
00078 mGradTypeSlider->setEnabled(false);
00079
00080 mGradTypeText = new Label;
00081
00082 std::string longText = _("Static");
00083
00084 if (getFont()->getWidth(_("Pulse")) > getFont()->getWidth(longText))
00085 longText = _("Pulse");
00086 if (getFont()->getWidth(_("Rainbow")) > getFont()->getWidth(longText))
00087 longText = _("Rainbow");
00088 if (getFont()->getWidth(_("Spectrum")) > getFont()->getWidth(longText))
00089 longText = _("Spectrum");
00090
00091 mGradTypeText->setCaption(longText);
00092
00093 mGradDelayLabel = new Label(_("Delay: "));
00094
00095 mGradDelayText = new TextField();
00096 mGradDelayText->setWidth(40);
00097 mGradDelayText->setRange(20, 100);
00098 mGradDelayText->setNumeric(true);
00099 mGradDelayText->addListener(this);
00100 mGradDelayText->setEnabled(false);
00101
00102 mGradDelaySlider = new Slider(20, 100);
00103 mGradDelaySlider->setWidth(180);
00104 mGradDelaySlider->setValue(mGradDelayText->getValue());
00105 mGradDelaySlider->setActionEventId("slider_graddelay");
00106 mGradDelaySlider->addActionListener(this);
00107 mGradDelaySlider->setEnabled(false);
00108
00109 mRedLabel = new Label(_("Red: "));
00110
00111 mRedText = new TextField;
00112 mRedText->setWidth(40);
00113 mRedText->setRange(0, 255);
00114 mRedText->setNumeric(true);
00115 mRedText->addListener(this);
00116 mRedText->setEnabled(false);
00117
00118 mRedSlider = new Slider(0, 255);
00119 mRedSlider->setWidth(180);
00120 mRedSlider->setValue(mRedText->getValue());
00121 mRedSlider->setActionEventId("slider_red");
00122 mRedSlider->addActionListener(this);
00123 mRedSlider->setEnabled(false);
00124
00125 mGreenLabel = new Label(_("Green: "));
00126
00127 mGreenText = new TextField;
00128 mGreenText->setWidth(40);
00129 mGreenText->setRange(0, 255);
00130 mGreenText->setNumeric(true);
00131 mGreenText->addListener(this);
00132 mGreenText->setEnabled(false);
00133
00134 mGreenSlider = new Slider(0, 255);
00135 mGreenSlider->setWidth(180);
00136 mGreenSlider->setValue(mGreenText->getValue());
00137 mGreenSlider->setActionEventId("slider_green");
00138 mGreenSlider->addActionListener(this);
00139 mGreenSlider->setEnabled(false);
00140
00141 mBlueLabel = new Label(_("Blue: "));
00142
00143 mBlueText = new TextField;
00144 mBlueText->setWidth(40);
00145 mBlueText->setRange(0, 255);
00146 mBlueText->setNumeric(true);
00147 mBlueText->addListener(this);
00148 mBlueText->setEnabled(false);
00149
00150 mBlueSlider = new Slider(0, 255);
00151 mBlueSlider->setWidth(180);
00152 mBlueSlider->setValue(mBlueText->getValue());
00153 mBlueSlider->setActionEventId("slider_blue");
00154 mBlueSlider->addActionListener(this);
00155 mBlueSlider->setEnabled(false);
00156
00157 setOpaque(false);
00158
00159
00160 LayoutHelper h(this);
00161 ContainerPlacer place = h.getPlacer(0, 0);
00162
00163 place(0, 0, mScroll, 5, 6).setPadding(2);
00164 place(0, 6, mPreviewBox, 5).setPadding(2);
00165 place(0, 7, mGradTypeLabel, 2);
00166 place(2, 7, mGradTypeSlider);
00167 place(3, 7, mGradTypeText, 2).setPadding(1);
00168 place(0, 8, mRedLabel, 2);
00169 place(2, 8, mRedSlider);
00170 place(3, 8, mRedText).setPadding(1);
00171 place(0, 9, mGreenLabel, 2);
00172 place(2, 9, mGreenSlider);
00173 place(3, 9, mGreenText).setPadding(1);
00174 place(0, 10, mBlueLabel, 2);
00175 place(2, 10, mBlueSlider);
00176 place(3, 10, mBlueText).setPadding(1);
00177 place(0, 11, mGradDelayLabel, 2);
00178 place(2, 11, mGradDelaySlider);
00179 place(3, 11, mGradDelayText).setPadding(1);
00180
00181 mGradTypeText->setCaption("");
00182
00183 setDimension(gcn::Rectangle(0, 0, 325, 280));
00184 }
00185
00186 Setup_Colors::~Setup_Colors()
00187 {
00188 if (mPreviewBox->getContent() == mPreview)
00189 delete mTextPreview;
00190 else
00191 delete mPreview;
00192 }
00193
00194 void Setup_Colors::action(const gcn::ActionEvent &event)
00195 {
00196 if (event.getId() == "color_box")
00197 {
00198 mSelected = mColorBox->getSelected();
00199 Palette::ColorType type = guiPalette->getColorTypeAt(mSelected);
00200 const gcn::Color *col = &guiPalette->getColor(type);
00201 Palette::GradientType grad = guiPalette->getGradientType(type);
00202 const int delay = guiPalette->getGradientDelay(type);
00203
00204 std::string msg;
00205 const char ch = guiPalette->getColorChar(type);
00206
00207 mPreview->clearRows();
00208 mPreviewBox->setContent(mTextPreview);
00209 mTextPreview->setFont(gui->getFont());
00210 mTextPreview->setTextColor(&guiPalette->getColor(Palette::TEXT));
00211 mTextPreview->setTextBGColor(NULL);
00212 mTextPreview->setOpaque(false);
00213 mTextPreview->setShadow(true);
00214 mTextPreview->setOutline(true);
00215 mTextPreview->useTextAlpha(false);
00216
00217 switch (type)
00218 {
00219 case Palette::TEXT:
00220 case Palette::SHADOW:
00221 case Palette::OUTLINE:
00222 mTextPreview->setFont(gui->getFont());
00223 mTextPreview->setShadow(type == Palette::SHADOW);
00224 mTextPreview->setOutline(type == Palette::OUTLINE);
00225 break;
00226 case Palette::PROGRESS_BAR:
00227 mTextPreview->useTextAlpha(true);
00228 mTextPreview->setFont(boldFont);
00229 mTextPreview->setTextColor(col);
00230 mTextPreview->setOutline(true);
00231 mTextPreview->setShadow(false);
00232 break;
00233 case Palette::TAB_HIGHLIGHT:
00234 mTextPreview->setFont(gui->getFont());
00235 mTextPreview->setTextColor(col);
00236 mTextPreview->setOutline(false);
00237 mTextPreview->setShadow(false);
00238 break;
00239 case Palette::BACKGROUND:
00240 case Palette::SHOP_WARNING:
00241 mTextPreview->setBGColor(col);
00242 mTextPreview->setOpaque(true);
00243 mTextPreview->setOutline(false);
00244 mTextPreview->setShadow(false);
00245 break;
00246 case Palette::HPBAR_FULL:
00247 case Palette::HPBAR_THREE_QUARTERS:
00248 case Palette::HPBAR_ONE_HALF:
00249 case Palette::HPBAR_ONE_QUARTER:
00250 mTextPreview->setTextBGColor(col);
00251 mTextPreview->setFont(boldFont);
00252 mTextPreview->setTextColor(&guiPalette->getColor(Palette::PROGRESS_BAR));
00253 mTextPreview->setOutline(true);
00254 mTextPreview->setShadow(false);
00255 mPreview->addRow(rawmsg);
00256 break;
00257 case Palette::HIGHLIGHT:
00258 mTextPreview->setTextBGColor(col);
00259 mTextPreview->setOutline(false);
00260 mTextPreview->setShadow(false);
00261 mPreview->addRow(rawmsg);
00262 break;
00263 case Palette::CHAT:
00264 case Palette::GM:
00265 case Palette::PLAYER:
00266 case Palette::WHISPER:
00267 case Palette::IS:
00268 case Palette::PARTY:
00269 case Palette::SERVER:
00270 case Palette::LOGGER:
00271 case Palette::HYPERLINK:
00272 mPreviewBox->setContent(mPreview);
00273 mPreview->clearRows();
00274
00275 if (ch == '<')
00276 msg = toString("@@|") + rawmsg + "@@";
00277 else
00278 msg = "##" + toString(ch) + rawmsg;
00279
00280 mPreview->addRow(msg);
00281 break;
00282 case Palette::ITEM_EQUIPPED:
00283 mTextPreview->setTextColor(col);
00284 mTextPreview->setOutline(false);
00285 mTextPreview->setShadow(false);
00286 break;
00287 case Palette::UNKNOWN_ITEM:
00288 case Palette::GENERIC:
00289 case Palette::HEAD:
00290 case Palette::USABLE:
00291 case Palette::TORSO:
00292 case Palette::ONEHAND:
00293 case Palette::LEGS:
00294 case Palette::FEET:
00295 case Palette::TWOHAND:
00296 case Palette::SHIELD:
00297 case Palette::RING:
00298 case Palette::NECKLACE:
00299 case Palette::ARMS:
00300 case Palette::AMMO:
00301 mTextPreview->setFont(boldFont);
00302 mTextPreview->setTextColor(col);
00303 mTextPreview->setOutline(false);
00304 mTextPreview->setShadow(false);
00305 break;
00306 case Palette::PARTICLE:
00307 case Palette::EXP_INFO:
00308 case Palette::PICKUP_INFO:
00309 case Palette::HIT_PLAYER_MONSTER:
00310 case Palette::HIT_MONSTER_PLAYER:
00311 case Palette::HIT_CRITICAL:
00312 case Palette::MISS:
00313 mTextPreview->setShadow(false);
00314 case Palette::BEING:
00315 case Palette::PC:
00316 case Palette::SELF:
00317 case Palette::GM_NAME:
00318 case Palette::NPC:
00319 case Palette::MONSTER:
00320 mTextPreview->setFont(boldFont);
00321 mTextPreview->setTextColor(col);
00322 case Palette::TYPE_COUNT:
00323 break;
00324 }
00325
00326 if (grad != Palette::STATIC && grad != Palette::PULSE)
00327 {
00328
00329 col = &guiPalette->getCommittedColor(type);
00330 }
00331 else if (grad == Palette::PULSE)
00332 {
00333 col = &guiPalette->getTestColor(type);
00334 }
00335
00336 setEntry(mGradDelaySlider, mGradDelayText, delay);
00337 setEntry(mRedSlider, mRedText, col->r);
00338 setEntry(mGreenSlider, mGreenText, col->g);
00339 setEntry(mBlueSlider, mBlueText, col->b);
00340
00341 mGradTypeSlider->setValue(grad);
00342 updateGradType();
00343 mGradTypeSlider->setEnabled(true);
00344
00345 return;
00346 }
00347
00348 if (event.getId() == "slider_grad")
00349 {
00350 updateGradType();
00351 updateColor();
00352 return;
00353 }
00354
00355 if (event.getId() == "slider_graddelay")
00356 {
00357 mGradDelayText->setText(toString(std::floor(mGradDelaySlider->getValue())));
00358 updateColor();
00359 return;
00360 }
00361
00362 if (event.getId() == "slider_red")
00363 {
00364 mRedText->setText(toString(std::floor(mRedSlider->getValue())));
00365 updateColor();
00366 return;
00367 }
00368
00369 if (event.getId() == "slider_green")
00370 {
00371 mGreenText->setText(toString(std::floor(mGreenSlider->getValue())));
00372 updateColor();
00373 return;
00374 }
00375
00376 if (event.getId() == "slider_blue")
00377 {
00378 mBlueText->setText(toString(std::floor(mBlueSlider->getValue())));
00379 updateColor();
00380 return;
00381 }
00382 }
00383
00384 void Setup_Colors::setEntry(gcn::Slider *s, TextField *t, int value)
00385 {
00386 s->setValue(value);
00387 char buffer[100];
00388 sprintf(buffer, "%d", value);
00389 t->setText(buffer);
00390 }
00391
00392 void Setup_Colors::apply()
00393 {
00394 guiPalette->commit();
00395 }
00396
00397 void Setup_Colors::cancel()
00398 {
00399 guiPalette->rollback();
00400 Palette::ColorType type = guiPalette->getColorTypeAt(mSelected);
00401 const gcn::Color *col = &guiPalette->getColor(type);
00402 mGradTypeSlider->setValue(guiPalette->getGradientType(type));
00403 const int delay = guiPalette->getGradientDelay(type);
00404 setEntry(mGradDelaySlider, mGradDelayText, delay);
00405 setEntry(mRedSlider, mRedText, col->r);
00406 setEntry(mGreenSlider, mGreenText, col->g);
00407 setEntry(mBlueSlider, mBlueText, col->b);
00408 }
00409
00410 void Setup_Colors::listen(const TextField *tf)
00411 {
00412 if (tf == mGradDelayText)
00413 mGradDelaySlider->setValue(tf->getValue());
00414 else if (tf == mRedText)
00415 mRedSlider->setValue(tf->getValue());
00416 else if (tf == mGreenText)
00417 mGreenSlider->setValue(tf->getValue());
00418 else if (tf == mBlueText)
00419 mBlueSlider->setValue(tf->getValue());
00420
00421 updateColor();
00422 }
00423
00424 void Setup_Colors::updateGradType()
00425 {
00426 if (mSelected == -1)
00427 return;
00428
00429 mSelected = mColorBox->getSelected();
00430 Palette::ColorType type = guiPalette->getColorTypeAt(mSelected);
00431 Palette::GradientType grad = guiPalette->getGradientType(type);
00432
00433 mGradTypeText->setCaption(
00434 (grad == Palette::STATIC) ? _("Static") :
00435 (grad == Palette::PULSE) ? _("Pulse") :
00436 (grad == Palette::RAINBOW) ? _("Rainbow") : _("Spectrum"));
00437
00438 const bool enable = (grad == Palette::STATIC || grad == Palette::PULSE);
00439 const bool delayEnable = (grad != Palette::STATIC);
00440
00441 mGradDelayText->setEnabled(delayEnable);
00442 mGradDelaySlider->setEnabled(delayEnable);
00443
00444 mRedText->setEnabled(enable);
00445 mRedSlider->setEnabled(enable);
00446 mGreenText->setEnabled(enable);
00447 mGreenSlider->setEnabled(enable);
00448 mBlueText->setEnabled(enable);
00449 mBlueSlider->setEnabled(enable);
00450 }
00451
00452 void Setup_Colors::updateColor()
00453 {
00454 if (mSelected == -1)
00455 return;
00456
00457 Palette::ColorType type = guiPalette->getColorTypeAt(mSelected);
00458 Palette::GradientType grad =
00459 static_cast<Palette::GradientType>((int)mGradTypeSlider->getValue());
00460 int delay = (int) mGradDelaySlider->getValue();
00461 guiPalette->setGradient(type, grad);
00462 guiPalette->setGradientDelay(type, delay);
00463
00464 if (grad == Palette::STATIC)
00465 {
00466 guiPalette->setColor(type,
00467 static_cast<int>(mRedSlider->getValue()),
00468 static_cast<int>(mGreenSlider->getValue()),
00469 static_cast<int>(mBlueSlider->getValue()));
00470 }
00471 else if (grad == Palette::PULSE)
00472 {
00473 guiPalette->setTestColor(type, gcn::Color(
00474 static_cast<int>(mRedSlider->getValue()),
00475 static_cast<int>(mGreenSlider->getValue()),
00476 static_cast<int>(mBlueSlider->getValue())));
00477 }
00478 }