00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/widgets/listbox.h"
00023
00024 #include "gui/palette.h"
00025 #include "gui/sdlinput.h"
00026
00027 #include "configuration.h"
00028
00029 #include <guichan/font.hpp>
00030 #include <guichan/graphics.hpp>
00031 #include <guichan/key.hpp>
00032 #include <guichan/listmodel.hpp>
00033
00034 float ListBox::mAlpha = 1.0;
00035
00036 ListBox::ListBox(gcn::ListModel *listModel):
00037 gcn::ListBox(listModel)
00038 {
00039 }
00040
00041 void ListBox::draw(gcn::Graphics *graphics)
00042 {
00043 if (!mListModel)
00044 return;
00045
00046 if (config.getValue("guialpha", 0.8) != mAlpha)
00047 mAlpha = config.getValue("guialpha", 0.8);
00048
00049 graphics->setColor(guiPalette->getColor(Palette::HIGHLIGHT,
00050 (int)(mAlpha * 255.0f)));
00051 graphics->setFont(getFont());
00052
00053 const int fontHeight = getFont()->getHeight();
00054
00055
00056 if (mSelected >= 0)
00057 graphics->fillRectangle(gcn::Rectangle(0, fontHeight * mSelected,
00058 getWidth(), fontHeight));
00059
00060
00061 graphics->setColor(guiPalette->getColor(Palette::TEXT));
00062 for (int i = 0, y = 0; i < mListModel->getNumberOfElements();
00063 ++i, y += fontHeight)
00064 {
00065 graphics->drawText(mListModel->getElementAt(i), 1, y);
00066 }
00067 }
00068
00069
00070 void ListBox::keyPressed(gcn::KeyEvent& keyEvent)
00071 {
00072 gcn::Key key = keyEvent.getKey();
00073
00074 if (key.getValue() == Key::ENTER || key.getValue() == Key::SPACE)
00075 {
00076 distributeActionEvent();
00077 keyEvent.consume();
00078 }
00079 else if (key.getValue() == Key::UP)
00080 {
00081 if (getSelected() > 0)
00082 setSelected(mSelected - 1);
00083 else if (getSelected() == 0 && mWrappingEnabled)
00084 setSelected(getListModel()->getNumberOfElements() - 1);
00085 keyEvent.consume();
00086 }
00087 else if (key.getValue() == Key::DOWN)
00088 {
00089 if (getSelected() < (getListModel()->getNumberOfElements() - 1))
00090 setSelected(mSelected + 1);
00091 else if (getSelected() == (getListModel()->getNumberOfElements() - 1) &&
00092 mWrappingEnabled)
00093 setSelected(0);
00094 keyEvent.consume();
00095 }
00096 else if (key.getValue() == Key::HOME)
00097 {
00098 setSelected(0);
00099 keyEvent.consume();
00100 }
00101 else if (key.getValue() == Key::END)
00102 {
00103 setSelected(getListModel()->getNumberOfElements() - 1);
00104 keyEvent.consume();
00105 }
00106 }
00107
00108 void ListBox::mouseWheelMovedUp(gcn::MouseEvent& mouseEvent)
00109 {
00110 if (isFocused())
00111 {
00112 if (getSelected() > 0)
00113 setSelected(getSelected() - 1);
00114 else if (getSelected() == 0 && mWrappingEnabled)
00115 setSelected(getListModel()->getNumberOfElements() - 1);
00116
00117 mouseEvent.consume();
00118 }
00119 }
00120
00121 void ListBox::mouseWheelMovedDown(gcn::MouseEvent& mouseEvent)
00122 {
00123 if (isFocused())
00124 {
00125 if (getSelected() < (getListModel()->getNumberOfElements() - 1))
00126 setSelected(getSelected() + 1);
00127 else if (getSelected() == (getListModel()->getNumberOfElements() - 1) &&
00128 mWrappingEnabled)
00129 setSelected(0);
00130
00131 mouseEvent.consume();
00132 }
00133 }
00134
00135 void ListBox::mouseDragged(gcn::MouseEvent &event)
00136 {
00137
00138
00139 mousePressed(event);
00140 }