summaryrefslogtreecommitdiff
path: root/src/gui/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets')
-rw-r--r--src/gui/widgets/button.cpp5
-rw-r--r--src/gui/widgets/channeltab.cpp9
-rw-r--r--src/gui/widgets/chattab.cpp2
-rw-r--r--src/gui/widgets/checkbox.cpp46
-rw-r--r--src/gui/widgets/checkbox.h14
-rw-r--r--src/gui/widgets/desktop.cpp36
-rw-r--r--src/gui/widgets/desktop.h3
-rw-r--r--src/gui/widgets/progressbar.cpp9
-rw-r--r--src/gui/widgets/radiobutton.cpp47
-rw-r--r--src/gui/widgets/radiobutton.h17
-rw-r--r--src/gui/widgets/scrollarea.cpp47
-rw-r--r--src/gui/widgets/scrollarea.h18
-rw-r--r--src/gui/widgets/slider.cpp85
-rw-r--r--src/gui/widgets/slider.h13
-rw-r--r--src/gui/widgets/tab.cpp14
-rw-r--r--src/gui/widgets/tabbedarea.cpp10
-rw-r--r--src/gui/widgets/tabbedarea.h5
-rw-r--r--src/gui/widgets/vertcontainer.cpp53
-rw-r--r--src/gui/widgets/vertcontainer.h47
-rw-r--r--src/gui/widgets/whispertab.cpp4
-rw-r--r--src/gui/widgets/window.cpp67
-rw-r--r--src/gui/widgets/window.h9
22 files changed, 497 insertions, 63 deletions
diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp
index 71579bd4..2357b263 100644
--- a/src/gui/widgets/button.cpp
+++ b/src/gui/widgets/button.cpp
@@ -152,7 +152,10 @@ void Button::draw(gcn::Graphics *graphics)
static_cast<Graphics*>(graphics)->
drawImageRect(0, 0, getWidth(), getHeight(), button[mode]);
- graphics->setColor(guiPalette->getColor(Palette::TEXT));
+ if (mode == BUTTON_DISABLED)
+ graphics->setColor(guiPalette->getColor(Palette::BUTTON_DISABLED));
+ else
+ graphics->setColor(guiPalette->getColor(Palette::BUTTON));
int textX;
int textY = getHeight() / 2 - getFont()->getHeight() / 2;
diff --git a/src/gui/widgets/channeltab.cpp b/src/gui/widgets/channeltab.cpp
index e3edbba0..8b055a22 100644
--- a/src/gui/widgets/channeltab.cpp
+++ b/src/gui/widgets/channeltab.cpp
@@ -72,23 +72,24 @@ bool ChannelTab::handleCommand(const std::string &type,
{
chatLog(_("Command: /quit"));
chatLog(_("This command leaves the current channel."));
- chatLog(_("If you're the last person in the channel, it will be deleted."));
+ chatLog(_("If you're the last person in the channel, "
+ "it will be deleted."));
}
else if (args == "op")
{
chatLog(_("Command: /op <nick>"));
chatLog(_("This command makes <nick> a channel operator."));
chatLog(_("If the <nick> has spaces in it, enclose it in "
- "double quotes (\")."));
+ "double quotes (\")."));
chatLog(_("Channel operators can kick and op other users "
- "from the channel."));
+ "from the channel."));
}
else if (args == "kick")
{
chatLog(_("Command: /kick <nick>"));
chatLog(_("This command makes <nick> leave the channel."));
chatLog(_("If the <nick> has spaces in it, enclose it in "
- "double quotes (\")."));
+ "double quotes (\")."));
}
else
return false;
diff --git a/src/gui/widgets/chattab.cpp b/src/gui/widgets/chattab.cpp
index d2fa33b8..e3ba4874 100644
--- a/src/gui/widgets/chattab.cpp
+++ b/src/gui/widgets/chattab.cpp
@@ -143,7 +143,7 @@ void ChatTab::chatLog(std::string line, int own, bool ignoreRecord)
lineColor = "##2"; // Equiv. to BrowserBox::GREEN
break;
case ACT_WHISPER:
- tmp.nick = strprintf(_("%s whispers: "), tmp.nick.c_str());
+ tmp.nick = strprintf(_("%s whispers: %s"), tmp.nick.c_str(), "");
lineColor = "##W";
break;
case ACT_IS:
diff --git a/src/gui/widgets/checkbox.cpp b/src/gui/widgets/checkbox.cpp
index 2e9a234b..dd57f674 100644
--- a/src/gui/widgets/checkbox.cpp
+++ b/src/gui/widgets/checkbox.cpp
@@ -35,9 +35,12 @@ Image *CheckBox::checkBoxNormal;
Image *CheckBox::checkBoxChecked;
Image *CheckBox::checkBoxDisabled;
Image *CheckBox::checkBoxDisabledChecked;
+Image *CheckBox::checkBoxNormalHi;
+Image *CheckBox::checkBoxCheckedHi;
CheckBox::CheckBox(const std::string &caption, bool selected):
- gcn::CheckBox(caption, selected)
+ gcn::CheckBox(caption, selected),
+ mHasMouse(false)
{
if (instances == 0)
{
@@ -47,10 +50,14 @@ CheckBox::CheckBox(const std::string &caption, bool selected):
checkBoxChecked = checkBox->getSubImage(9, 0, 9, 10);
checkBoxDisabled = checkBox->getSubImage(18, 0, 9, 10);
checkBoxDisabledChecked = checkBox->getSubImage(27, 0, 9, 10);
+ checkBoxNormalHi = checkBox->getSubImage(36, 0, 9, 10);
+ checkBoxCheckedHi = checkBox->getSubImage(45, 0, 9, 10);
checkBoxNormal->setAlpha(mAlpha);
checkBoxChecked->setAlpha(mAlpha);
checkBoxDisabled->setAlpha(mAlpha);
checkBoxDisabledChecked->setAlpha(mAlpha);
+ checkBoxNormalHi->setAlpha(mAlpha);
+ checkBoxCheckedHi->setAlpha(mAlpha);
checkBox->decRef();
}
@@ -67,6 +74,8 @@ CheckBox::~CheckBox()
delete checkBoxChecked;
delete checkBoxDisabled;
delete checkBoxDisabledChecked;
+ delete checkBoxNormalHi;
+ delete checkBoxCheckedHi;
}
}
@@ -86,17 +95,22 @@ void CheckBox::drawBox(gcn::Graphics* graphics)
{
Image *box;
- if (isSelected())
- {
- if (isEnabled())
- box = checkBoxChecked;
+ if (isEnabled())
+ if (isSelected())
+ if (mHasMouse)
+ box = checkBoxCheckedHi;
+ else
+ box = checkBoxChecked;
else
- box = checkBoxDisabledChecked;
- }
- else if (isEnabled())
- box = checkBoxNormal;
+ if (mHasMouse)
+ box = checkBoxNormalHi;
+ else
+ box = checkBoxNormal;
else
- box = checkBoxDisabled;
+ if (isSelected())
+ box = checkBoxDisabledChecked;
+ else
+ box = checkBoxDisabled;
if (config.getValue("guialpha", 0.8) != mAlpha)
{
@@ -105,7 +119,19 @@ void CheckBox::drawBox(gcn::Graphics* graphics)
checkBoxChecked->setAlpha(mAlpha);
checkBoxDisabled->setAlpha(mAlpha);
checkBoxDisabledChecked->setAlpha(mAlpha);
+ checkBoxNormal->setAlpha(mAlpha);
+ checkBoxCheckedHi->setAlpha(mAlpha);
}
static_cast<Graphics*>(graphics)->drawImage(box, 2, 2);
}
+
+void CheckBox::mouseEntered(gcn::MouseEvent& event)
+{
+ mHasMouse = true;
+}
+
+void CheckBox::mouseExited(gcn::MouseEvent& event)
+{
+ mHasMouse = false;
+}
diff --git a/src/gui/widgets/checkbox.h b/src/gui/widgets/checkbox.h
index 303782b0..7a7c8674 100644
--- a/src/gui/widgets/checkbox.h
+++ b/src/gui/widgets/checkbox.h
@@ -24,6 +24,7 @@
#include <guichan/widgets/checkbox.hpp>
+
class Image;
/**
@@ -54,13 +55,26 @@ class CheckBox : public gcn::CheckBox
*/
void drawBox(gcn::Graphics* graphics);
+ /**
+ * Called when the mouse enteres the widget area.
+ */
+ void mouseEntered(gcn::MouseEvent& event);
+
+ /**
+ * Called when the mouse leaves the widget area.
+ */
+ void mouseExited(gcn::MouseEvent& event);
+
private:
static int instances;
static float mAlpha;
+ bool mHasMouse;
static Image *checkBoxNormal;
static Image *checkBoxChecked;
static Image *checkBoxDisabled;
static Image *checkBoxDisabledChecked;
+ static Image *checkBoxNormalHi;
+ static Image *checkBoxCheckedHi;
};
#endif
diff --git a/src/gui/widgets/desktop.cpp b/src/gui/widgets/desktop.cpp
index a4164bcc..13ac866a 100644
--- a/src/gui/widgets/desktop.cpp
+++ b/src/gui/widgets/desktop.cpp
@@ -39,8 +39,9 @@ Desktop::Desktop()
Wallpaper::loadWallpapers();
- gcn::Label *versionLabel = new Label(FULL_VERSION);
- add(versionLabel, 25, 2);
+ mVersionLabel = new Label(FULL_VERSION);
+ mVersionLabel->setBackgroundColor(gcn::Color(255, 255, 255, 128));
+ add(mVersionLabel, 25, 2);
}
Desktop::~Desktop()
@@ -74,11 +75,20 @@ void Desktop::draw(gcn::Graphics *graphics)
if (mWallpaper)
{
- g->drawImage(mWallpaper,
+ if (!mWallpaper->isAnOpenGLOne())
+ g->drawImage(mWallpaper,
(getWidth() - mWallpaper->getWidth()) / 2,
(getHeight() - mWallpaper->getHeight()) / 2);
+ else
+ g->drawRescaledImage(mWallpaper, 0, 0, 0, 0,
+ mWallpaper->getWidth(), mWallpaper->getHeight(),
+ getWidth(), getHeight(), false);
}
+ // Draw a thin border under the application version...
+ g->setColor(gcn::Color(255, 255, 255, 128));
+ g->fillRectangle(gcn::Rectangle(mVersionLabel->getDimension()));
+
Container::draw(graphics);
}
@@ -87,13 +97,27 @@ void Desktop::setBestFittingWallpaper()
const std::string wallpaperName =
Wallpaper::getWallpaper(getWidth(), getHeight());
- Image *temp = ResourceManager::getInstance()->getImage(wallpaperName);
+ Image *nWallPaper = ResourceManager::getInstance()->getImage(wallpaperName);
- if (temp)
+ if (nWallPaper)
{
if (mWallpaper)
mWallpaper->decRef();
- mWallpaper = temp;
+
+ if (!nWallPaper->isAnOpenGLOne() && (nWallPaper->getWidth() != getWidth()
+ || nWallPaper->getHeight() != getHeight()))
+ {
+ // We rescale to obtain a fullscreen wallpaper...
+ Image *newRsclWlPpr = nWallPaper->SDLgetScaledImage(getWidth(), getHeight());
+ std::string idPath = nWallPaper->getIdPath();
+
+ // We replace the resource in the resource manager
+ nWallPaper->decRef();
+ ResourceManager::getInstance()->addResource(idPath, newRsclWlPpr);
+ mWallpaper = newRsclWlPpr;
+ }
+ else
+ mWallpaper = nWallPaper;
}
else
{
diff --git a/src/gui/widgets/desktop.h b/src/gui/widgets/desktop.h
index ad04ee96..da623bbd 100644
--- a/src/gui/widgets/desktop.h
+++ b/src/gui/widgets/desktop.h
@@ -24,6 +24,8 @@
#include "gui/widgets/container.h"
+#include "guichanfwd.h"
+
#include <guichan/widgetlistener.hpp>
class Image;
@@ -60,6 +62,7 @@ class Desktop : public Container, gcn::WidgetListener
void setBestFittingWallpaper();
Image *mWallpaper;
+ gcn::Label *mVersionLabel;
};
#endif // DESKTOP_H
diff --git a/src/gui/widgets/progressbar.cpp b/src/gui/widgets/progressbar.cpp
index 134d071f..7cc020ef 100644
--- a/src/gui/widgets/progressbar.cpp
+++ b/src/gui/widgets/progressbar.cpp
@@ -43,14 +43,17 @@ ProgressBar::ProgressBar(float progress,
int width, int height,
const gcn::Color &color):
gcn::Widget(),
- mProgress(0.0f),
- mProgressToGo(0.0f),
mSmoothProgress(true),
mColor(color),
mColorToGo(color),
mSmoothColorChange(true)
{
- setProgress(progress);
+ // The progress value is directly set at load time:
+ if (progress > 1.0f || progress < 0.0f)
+ progress = 1.0f;
+
+ mProgress = mProgressToGo = progress;
+
setSize(width, height);
if (mInstances == 0)
diff --git a/src/gui/widgets/radiobutton.cpp b/src/gui/widgets/radiobutton.cpp
index 6f0ccdbd..9cf49672 100644
--- a/src/gui/widgets/radiobutton.cpp
+++ b/src/gui/widgets/radiobutton.cpp
@@ -33,10 +33,13 @@ Image *RadioButton::radioNormal;
Image *RadioButton::radioChecked;
Image *RadioButton::radioDisabled;
Image *RadioButton::radioDisabledChecked;
+Image *RadioButton::radioNormalHi;
+Image *RadioButton::radioCheckedHi;
RadioButton::RadioButton(const std::string &caption, const std::string &group,
bool marked):
- gcn::RadioButton(caption, group, marked)
+ gcn::RadioButton(caption, group, marked),
+ mHasMouse(false)
{
if (instances == 0)
{
@@ -45,10 +48,14 @@ RadioButton::RadioButton(const std::string &caption, const std::string &group,
radioChecked = resman->getImage("graphics/gui/radioin.png");
radioDisabled = resman->getImage("graphics/gui/radioout.png");
radioDisabledChecked = resman->getImage("graphics/gui/radioin.png");
+ radioNormalHi = resman->getImage("graphics/gui/radioout_highlight.png");
+ radioCheckedHi = resman->getImage("graphics/gui/radioin_highlight.png");
radioNormal->setAlpha(mAlpha);
radioChecked->setAlpha(mAlpha);
radioDisabled->setAlpha(mAlpha);
radioDisabledChecked->setAlpha(mAlpha);
+ radioNormalHi->setAlpha(mAlpha);
+ radioCheckedHi->setAlpha(mAlpha);
}
instances++;
@@ -64,6 +71,8 @@ RadioButton::~RadioButton()
radioChecked->decRef();
radioDisabled->decRef();
radioDisabledChecked->decRef();
+ radioNormalHi->decRef();
+ radioCheckedHi->decRef();
}
}
@@ -76,21 +85,28 @@ void RadioButton::drawBox(gcn::Graphics* graphics)
radioChecked->setAlpha(mAlpha);
radioDisabled->setAlpha(mAlpha);
radioDisabledChecked->setAlpha(mAlpha);
+ radioNormalHi->setAlpha(mAlpha);
+ radioCheckedHi->setAlpha(mAlpha);
}
Image *box = NULL;
- if (isSelected())
- {
- if (isEnabled())
- box = radioChecked;
+ if (isEnabled())
+ if (isSelected())
+ if (mHasMouse)
+ box = radioCheckedHi;
+ else
+ box = radioChecked;
else
- box = radioDisabledChecked;
- }
- else if (isEnabled())
- box = radioNormal;
+ if (mHasMouse)
+ box = radioNormalHi;
+ else
+ box = radioNormal;
else
- box = radioDisabled;
+ if (isSelected())
+ box = radioDisabledChecked;
+ else
+ box = radioDisabled;
if (box)
static_cast<Graphics*>(graphics)->drawImage(box, 2, 2);
@@ -111,3 +127,14 @@ void RadioButton::draw(gcn::Graphics* graphics)
int h = getHeight() + getHeight() / 2;
graphics->drawText(getCaption(), h - 2, 0);
}
+
+void RadioButton::mouseEntered(gcn::MouseEvent& event)
+{
+ mHasMouse = true;
+}
+
+void RadioButton::mouseExited(gcn::MouseEvent& event)
+{
+ mHasMouse = false;
+}
+
diff --git a/src/gui/widgets/radiobutton.h b/src/gui/widgets/radiobutton.h
index 9aec3add..57eb3623 100644
--- a/src/gui/widgets/radiobutton.h
+++ b/src/gui/widgets/radiobutton.h
@@ -26,13 +26,13 @@
class Image;
-/*
+/**
* Guichan based RadioButton with custom look
*/
class RadioButton : public gcn::RadioButton
{
public:
- /*
+ /**
* Constructor.
*/
RadioButton(const std::string &caption,const std::string &group,
@@ -54,13 +54,26 @@ class RadioButton : public gcn::RadioButton
*/
void draw(gcn::Graphics* graphics);
+ /**
+ * Called when the mouse enteres the widget area.
+ */
+ void mouseEntered(gcn::MouseEvent& event);
+
+ /**
+ * Called when the mouse leaves the widget area.
+ */
+ void mouseExited(gcn::MouseEvent& event);
+
private:
static int instances;
static float mAlpha;
+ bool mHasMouse;
static Image *radioNormal;
static Image *radioChecked;
static Image *radioDisabled;
static Image *radioDisabledChecked;
+ static Image *radioNormalHi;
+ static Image *radioCheckedHi;
};
#endif /* RADIOBUTTON_H */
diff --git a/src/gui/widgets/scrollarea.cpp b/src/gui/widgets/scrollarea.cpp
index ff3a23d1..52322b05 100644
--- a/src/gui/widgets/scrollarea.cpp
+++ b/src/gui/widgets/scrollarea.cpp
@@ -33,10 +33,13 @@ int ScrollArea::instances = 0;
float ScrollArea::mAlpha = 1.0;
ImageRect ScrollArea::background;
ImageRect ScrollArea::vMarker;
+ImageRect ScrollArea::vMarkerHi;
Image *ScrollArea::buttons[4][2];
ScrollArea::ScrollArea():
gcn::ScrollArea(),
+ mX(0),
+ mY(0),
mOpaque(true)
{
init();
@@ -44,6 +47,7 @@ ScrollArea::ScrollArea():
ScrollArea::ScrollArea(gcn::Widget *widget):
gcn::ScrollArea(widget),
+ mHasMouse(false),
mOpaque(true)
{
init();
@@ -60,6 +64,7 @@ ScrollArea::~ScrollArea()
{
for_each(background.grid, background.grid + 9, dtor<Image*>());
for_each(vMarker.grid, vMarker.grid + 9, dtor<Image*>());
+ for_each(vMarkerHi.grid, vMarkerHi.grid + 9, dtor<Image*>());
buttons[UP][0]->decRef();
buttons[UP][1]->decRef();
@@ -103,6 +108,8 @@ void ScrollArea::init()
// Load vertical scrollbar skin
Image *vscroll = resman->getImage("graphics/gui/vscroll_grey.png");
+ Image *vscrollHi = resman->getImage("graphics/gui/vscroll_highlight.png");
+
int vsgridx[4] = {0, 4, 7, 11};
int vsgridy[4] = {0, 4, 15, 19};
a = 0;
@@ -115,12 +122,18 @@ void ScrollArea::init()
vsgridx[x], vsgridy[y],
vsgridx[x + 1] - vsgridx[x],
vsgridy[y + 1] - vsgridy[y]);
+ vMarkerHi.grid[a] = vscrollHi->getSubImage(
+ vsgridx[x], vsgridy[y],
+ vsgridx[x + 1] - vsgridx[x],
+ vsgridy[y + 1] - vsgridy[y]);
vMarker.grid[a]->setAlpha(config.getValue("guialpha", 0.8));
+ vMarkerHi.grid[a]->setAlpha(config.getValue("guialpha", 0.8));
a++;
}
}
vscroll->decRef();
+ vscrollHi->decRef();
buttons[UP][0] =
resman->getImage("graphics/gui/vscroll_up_default.png");
@@ -202,6 +215,7 @@ void ScrollArea::draw(gcn::Graphics *graphics)
{
background.grid[a]->setAlpha(mAlpha);
vMarker.grid[a]->setAlpha(mAlpha);
+ vMarkerHi.grid[a]->setAlpha(mAlpha);
}
}
@@ -296,14 +310,39 @@ void ScrollArea::drawVMarker(gcn::Graphics *graphics)
{
gcn::Rectangle dim = getVerticalMarkerDimension();
- static_cast<Graphics*>(graphics)->
- drawImageRect(dim.x, dim.y, dim.width, dim.height, vMarker);
+ if ((mHasMouse) && (mX > (getWidth() - getScrollbarWidth())))
+ static_cast<Graphics*>(graphics)->
+ drawImageRect(dim.x, dim.y, dim.width, dim.height, vMarkerHi);
+ else
+ static_cast<Graphics*>(graphics)->
+ drawImageRect(dim.x, dim.y, dim.width, dim.height,vMarker);
}
void ScrollArea::drawHMarker(gcn::Graphics *graphics)
{
gcn::Rectangle dim = getHorizontalMarkerDimension();
- static_cast<Graphics*>(graphics)->
- drawImageRect(dim.x, dim.y, dim.width, dim.height, vMarker);
+ if ((mHasMouse) && (mY > (getHeight() - getScrollbarWidth())))
+ static_cast<Graphics*>(graphics)->
+ drawImageRect(dim.x, dim.y, dim.width, dim.height, vMarkerHi);
+ else
+ static_cast<Graphics*>(graphics)->
+ drawImageRect(dim.x, dim.y, dim.width, dim.height, vMarker);
}
+
+void ScrollArea::mouseMoved(gcn::MouseEvent& event)
+{
+mX = event.getX();
+mY = event.getY();
+}
+
+void ScrollArea::mouseEntered(gcn::MouseEvent& event)
+{
+ mHasMouse = true;
+}
+
+void ScrollArea::mouseExited(gcn::MouseEvent& event)
+{
+ mHasMouse = false;
+}
+
diff --git a/src/gui/widgets/scrollarea.h b/src/gui/widgets/scrollarea.h
index 700de32b..8fd92b5f 100644
--- a/src/gui/widgets/scrollarea.h
+++ b/src/gui/widgets/scrollarea.h
@@ -83,6 +83,21 @@ class ScrollArea : public gcn::ScrollArea
*/
bool isOpaque() const { return mOpaque; }
+ /**
+ * Called when the mouse moves in the widget area.
+ */
+ void mouseMoved(gcn::MouseEvent& event);
+
+ /**
+ * Called when the mouse enteres the widget area.
+ */
+ void mouseEntered(gcn::MouseEvent& event);
+
+ /**
+ * Called when the mouse leaves the widget area.
+ */
+ void mouseExited(gcn::MouseEvent& event);
+
protected:
enum BUTTON_DIR {
UP,
@@ -110,8 +125,11 @@ class ScrollArea : public gcn::ScrollArea
static float mAlpha;
static ImageRect background;
static ImageRect vMarker;
+ static ImageRect vMarkerHi;
static Image *buttons[4][2];
+ int mX,mY;
+ bool mHasMouse;
bool mOpaque;
};
diff --git a/src/gui/widgets/slider.cpp b/src/gui/widgets/slider.cpp
index 7cd0e54a..6ce5f849 100644
--- a/src/gui/widgets/slider.cpp
+++ b/src/gui/widgets/slider.cpp
@@ -29,17 +29,21 @@
Image *Slider::hStart, *Slider::hMid, *Slider::hEnd, *Slider::hGrip;
Image *Slider::vStart, *Slider::vMid, *Slider::vEnd, *Slider::vGrip;
+Image *Slider::hStartHi, *Slider::hMidHi, *Slider::hEndHi, *Slider::hGripHi;
+Image *Slider::vStartHi, *Slider::vMidHi, *Slider::vEndHi, *Slider::vGripHi;
float Slider::mAlpha = 1.0;
int Slider::mInstances = 0;
Slider::Slider(double scaleEnd):
- gcn::Slider(scaleEnd)
+ gcn::Slider(scaleEnd),
+ mHasMouse(false)
{
init();
}
Slider::Slider(double scaleStart, double scaleEnd):
- gcn::Slider(scaleStart, scaleEnd)
+ gcn::Slider(scaleStart, scaleEnd),
+ mHasMouse(false)
{
init();
}
@@ -58,6 +62,14 @@ Slider::~Slider()
delete vMid;
delete vEnd;
delete vGrip;
+ delete hStartHi;
+ delete hMidHi;
+ delete hEndHi;
+ delete hGripHi;
+ delete vStartHi;
+ delete vMidHi;
+ delete vEndHi;
+ delete vGripHi;
}
}
@@ -71,6 +83,7 @@ void Slider::init()
{
ResourceManager *resman = ResourceManager::getInstance();
Image *slider = resman->getImage("graphics/gui/slider.png");
+ Image *sliderHi = resman->getImage("graphics/gui/slider_hilight.png");
x = 0; y = 0;
w = 15; h = 6;
@@ -78,10 +91,14 @@ void Slider::init()
hStart = slider->getSubImage(x, y, o1 - x, h);
hMid = slider->getSubImage(o1, y, o2 - o1, h);
hEnd = slider->getSubImage(o2, y, w - o2 + x, h);
+ hStartHi = sliderHi->getSubImage(x, y, o1 - x, h);
+ hMidHi = sliderHi->getSubImage(o1, y, o2 - o1, h);
+ hEndHi = sliderHi->getSubImage(o2, y, w - o2 + x, h);
x = 6; y = 8;
w = 9; h = 10;
hGrip = slider->getSubImage(x, y, w, h);
+ hGripHi = sliderHi->getSubImage(x, y, w, h);
x = 0; y = 6;
w = 6; h = 21;
@@ -89,22 +106,35 @@ void Slider::init()
vStart = slider->getSubImage(x, y, w, o1 - y);
vMid = slider->getSubImage(x, o1, w, o2 - o1);
vEnd = slider->getSubImage(x, o2, w, h - o2 + y);
+ vStartHi = sliderHi->getSubImage(x, y, w, o1 - y);
+ vMidHi = sliderHi->getSubImage(x, o1, w, o2 - o1);
+ vEndHi = sliderHi->getSubImage(x, o2, w, h - o2 + y);
x = 6; y = 8;
w = 9; h = 10;
vGrip = slider->getSubImage(x, y, w, h);
+ vGripHi = sliderHi->getSubImage(x, y, w, h);
slider->decRef();
+ sliderHi->decRef();
hStart->setAlpha(mAlpha);
hMid->setAlpha(mAlpha);
hEnd->setAlpha(mAlpha);
hGrip->setAlpha(mAlpha);
+ hStartHi->setAlpha(mAlpha);
+ hMidHi->setAlpha(mAlpha);
+ hEndHi->setAlpha(mAlpha);
+ hGripHi->setAlpha(mAlpha);
vStart->setAlpha(mAlpha);
vMid->setAlpha(mAlpha);
vEnd->setAlpha(mAlpha);
vGrip->setAlpha(mAlpha);
+ vStartHi->setAlpha(mAlpha);
+ vMidHi->setAlpha(mAlpha);
+ vEndHi->setAlpha(mAlpha);
+ vGripHi->setAlpha(mAlpha);
}
mInstances++;
@@ -117,7 +147,7 @@ void Slider::draw(gcn::Graphics *graphics)
int w = getWidth();
int h = getHeight();
int x = 0;
- int y = (h - hStart->getHeight()) / 2;
+ int y = mHasMouse?(h - hStartHi->getHeight()) / 2:(h - hStart->getHeight()) / 2;
if (config.getValue("guialpha", 0.8) != mAlpha)
{
@@ -126,23 +156,45 @@ void Slider::draw(gcn::Graphics *graphics)
hMid->setAlpha(mAlpha);
hEnd->setAlpha(mAlpha);
hGrip->setAlpha(mAlpha);
+ hStartHi->setAlpha(mAlpha);
+ hMidHi->setAlpha(mAlpha);
+ hEndHi->setAlpha(mAlpha);
+ hGripHi->setAlpha(mAlpha);
vStart->setAlpha(mAlpha);
vMid->setAlpha(mAlpha);
vEnd->setAlpha(mAlpha);
vGrip->setAlpha(mAlpha);
+ vStartHi->setAlpha(mAlpha);
+ vMidHi->setAlpha(mAlpha);
+ vEndHi->setAlpha(mAlpha);
+ vGripHi->setAlpha(mAlpha);
}
+ if (!mHasMouse)
+ {
+ static_cast<Graphics*>(graphics)->drawImage(hStart, x, y);
- static_cast<Graphics*>(graphics)->drawImage(hStart, x, y);
+ w -= hStart->getWidth() + hEnd->getWidth();
+ x += hStart->getWidth();
- w -= hStart->getWidth() + hEnd->getWidth();
- x += hStart->getWidth();
+ static_cast<Graphics*>(graphics)->
+ drawImagePattern(hMid, x, y, w, hMid->getHeight());
- static_cast<Graphics*>(graphics)->
- drawImagePattern(hMid, x, y, w, hMid->getHeight());
+ x += w;
+ static_cast<Graphics*>(graphics)->drawImage(hEnd, x, y);
+ } else
+ {
+ static_cast<Graphics*>(graphics)->drawImage(hStartHi, x, y);
- x += w;
- static_cast<Graphics*>(graphics)->drawImage(hEnd, x, y);
+ w -= hStartHi->getWidth() + hEndHi->getWidth();
+ x += hStartHi->getWidth();
+
+ static_cast<Graphics*>(graphics)->
+ drawImagePattern(hMidHi, x, y, w, hMidHi->getHeight());
+
+ x += w;
+ static_cast<Graphics*>(graphics)->drawImage(hEndHi, x, y);
+ }
drawMarker(graphics);
}
@@ -150,5 +202,16 @@ void Slider::draw(gcn::Graphics *graphics)
void Slider::drawMarker(gcn::Graphics *graphics)
{
static_cast<Graphics*>(graphics)->
- drawImage(hGrip, getMarkerPosition(), (getHeight() - hGrip->getHeight()) / 2);
+ drawImage(mHasMouse?hGripHi:hGrip, getMarkerPosition(),
+ (getHeight() - (mHasMouse?hGripHi:hGrip)->getHeight()) / 2);
}
+
+void Slider::mouseEntered(gcn::MouseEvent& event)
+{
+ mHasMouse = true;
+}
+
+void Slider::mouseExited(gcn::MouseEvent& event)
+{
+ mHasMouse = false;
+} \ No newline at end of file
diff --git a/src/gui/widgets/slider.h b/src/gui/widgets/slider.h
index 56ea334a..85fb2633 100644
--- a/src/gui/widgets/slider.h
+++ b/src/gui/widgets/slider.h
@@ -58,6 +58,16 @@ class Slider : public gcn::Slider {
*/
void drawMarker(gcn::Graphics *graphics);
+ /**
+ * Called when the mouse enteres the widget area.
+ */
+ void mouseEntered(gcn::MouseEvent& event);
+
+ /**
+ * Called when the mouse leaves the widget area.
+ */
+ void mouseExited(gcn::MouseEvent& event);
+
private:
/**
* Used to initialize instances.
@@ -66,6 +76,9 @@ class Slider : public gcn::Slider {
static Image *hStart, *hMid, *hEnd, *hGrip;
static Image *vStart, *vMid, *vEnd, *vGrip;
+ static Image *hStartHi, *hMidHi, *hEndHi, *hGripHi;
+ static Image *vStartHi, *vMidHi, *vEndHi, *vGripHi;
+ bool mHasMouse;
static float mAlpha;
static int mInstances;
};
diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp
index f2231fca..3e49263e 100644
--- a/src/gui/widgets/tab.cpp
+++ b/src/gui/widgets/tab.cpp
@@ -55,7 +55,7 @@ struct TabData
static TabData const data[TAB_COUNT] = {
{ "graphics/gui/tab.png", 0, 0 },
- { "graphics/gui/tab.png", 9, 4 },
+ { "graphics/gui/tab_hilight.png", 9, 4 },
{ "graphics/gui/tabselected.png", 16, 19 },
{ "graphics/gui/tab.png", 25, 23 }
};
@@ -63,7 +63,7 @@ static TabData const data[TAB_COUNT] = {
ImageRect Tab::tabImg[TAB_COUNT];
Tab::Tab() : gcn::Tab(),
- mTabColor(&guiPalette->getColor(Palette::TEXT))
+ mTabColor(&guiPalette->getColor(Palette::TAB))
{
init();
}
@@ -123,21 +123,19 @@ void Tab::draw(gcn::Graphics *graphics)
// check which type of tab to draw
if (mTabbedArea)
{
+ mLabel->setForegroundColor(*mTabColor);
if (mTabbedArea->isTabSelected(this))
{
mode = TAB_SELECTED;
// if tab is selected, it doesnt need to highlight activity
- mLabel->setForegroundColor(*mTabColor);
mHighlighted = false;
- }
- else if (mHighlighted)
+ } else if (mHasMouse)
{
mode = TAB_HIGHLIGHTED;
- mLabel->setForegroundColor(guiPalette->getColor(Palette::TAB_HIGHLIGHT));
}
- else
+ if (mHighlighted)
{
- mLabel->setForegroundColor(*mTabColor);
+ mLabel->setForegroundColor(guiPalette->getColor(Palette::TAB_HIGHLIGHT));
}
}
diff --git a/src/gui/widgets/tabbedarea.cpp b/src/gui/widgets/tabbedarea.cpp
index 07f46a94..bb5ae9a4 100644
--- a/src/gui/widgets/tabbedarea.cpp
+++ b/src/gui/widgets/tabbedarea.cpp
@@ -69,6 +69,16 @@ gcn::Widget *TabbedArea::getWidget(const std::string &name) const
return NULL;
}
+gcn::Widget *TabbedArea::getCurrentWidget()
+{
+ gcn::Tab *tab = getSelectedTab();
+
+ if (tab)
+ return getWidget(tab->getCaption());
+ else
+ return NULL;
+}
+
void TabbedArea::addTab(const std::string &caption, gcn::Widget *widget)
{
Tab *tab = new Tab;
diff --git a/src/gui/widgets/tabbedarea.h b/src/gui/widgets/tabbedarea.h
index 6aaafe16..29ba2f76 100644
--- a/src/gui/widgets/tabbedarea.h
+++ b/src/gui/widgets/tabbedarea.h
@@ -63,6 +63,11 @@ class TabbedArea : public gcn::TabbedArea
*/
gcn::Widget *getWidget(const std::string &name) const;
+ /**
+ * Returns the widget for the current tab
+ */
+ gcn::Widget *getCurrentWidget();
+
using gcn::TabbedArea::addTab;
/**
diff --git a/src/gui/widgets/vertcontainer.cpp b/src/gui/widgets/vertcontainer.cpp
new file mode 100644
index 00000000..9dd02cdc
--- /dev/null
+++ b/src/gui/widgets/vertcontainer.cpp
@@ -0,0 +1,53 @@
+/*
+ * The Mana World
+ * Copyright (C) 2009 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "gui/widgets/vertcontainer.h"
+
+VertContainer::VertContainer(int spacing):
+ mSpacing(spacing),
+ mCount(0)
+{
+ addWidgetListener(this);
+}
+
+void VertContainer::add(gcn::Widget *widget)
+{
+ Container::add(widget);
+ widget->setPosition(0, mCount * mSpacing);
+ widget->setSize(getWidth(), mSpacing);
+ mCount++;
+ setHeight(mCount * mSpacing);
+}
+
+void VertContainer::clear()
+{
+ Container::clear();
+
+ mCount = 0;
+}
+
+void VertContainer::widgetResized(const gcn::Event &event)
+{
+ for (WidgetListIterator it = mWidgets.begin(); it != mWidgets.end(); it++)
+ {
+ (*it)->setWidth(getWidth());
+ }
+}
diff --git a/src/gui/widgets/vertcontainer.h b/src/gui/widgets/vertcontainer.h
new file mode 100644
index 00000000..9e15e66a
--- /dev/null
+++ b/src/gui/widgets/vertcontainer.h
@@ -0,0 +1,47 @@
+/*
+ * The Mana World
+ * Copyright (C) 2009 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef GUI_VERTCONTAINER_H
+#define GUI_VERTCONTAINER_H
+
+#include "gui/widgets/container.h"
+
+#include <guichan/widgetlistener.hpp>
+
+/**
+ * A widget container.
+ *
+ * This container places it's contents veritcally.
+ */
+class VertContainer : public Container, public gcn::WidgetListener
+{
+ public:
+ VertContainer(int spacing);
+ virtual void add(gcn::Widget *widget);
+ virtual void clear();
+ void widgetResized(const gcn::Event &event);
+
+ private:
+ int mSpacing;
+ int mCount;
+};
+
+#endif
diff --git a/src/gui/widgets/whispertab.cpp b/src/gui/widgets/whispertab.cpp
index 43c63cc0..5509a589 100644
--- a/src/gui/widgets/whispertab.cpp
+++ b/src/gui/widgets/whispertab.cpp
@@ -84,14 +84,14 @@ bool WhisperTab::handleCommand(const std::string &type,
else if (args == "ignore")
{
chatLog(_("Command: /ignore"));
- chatLog(_("This command ignores the other player reguardless of "
+ chatLog(_("This command ignores the other player regardless of "
"current relations."));
}
else if (args == "unignore")
{
chatLog(_("Command: /unignore <player>"));
chatLog(_("This command stops ignoring the other player if they "
- "are being ignored"));
+ "are being ignored."));
}
else
return false;
diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp
index 19d80671..1ee84a6f 100644
--- a/src/gui/widgets/window.cpp
+++ b/src/gui/widgets/window.cpp
@@ -306,6 +306,10 @@ void Window::setVisible(bool visible)
void Window::setVisible(bool visible, bool forceSticky)
{
+ // Check if the window is off screen...
+ if (visible)
+ checkIfIsOffScreen();
+
gcn::Window::setVisible((!forceSticky && isSticky()) || visible);
}
@@ -526,6 +530,9 @@ void Window::loadWindowState()
{
setSize(mDefaultWidth, mDefaultHeight);
}
+
+ // Check if the window is off screen...
+ checkIfIsOffScreen();
}
void Window::saveWindowState()
@@ -739,3 +746,63 @@ void Window::center()
{
setLocationRelativeTo(getParent());
}
+
+void Window::checkIfIsOffScreen(bool partially, bool entirely)
+{
+ // Move the window onto screen if it has become off screen
+ // For instance, because of resolution change...
+
+ // First of all, don't deal when a window hasn't got
+ // any size initialized yet...
+ if (getWidth() == 0 && getHeight() == 0)
+ return;
+
+ // Made partially the default behaviour
+ if (!partially && !entirely)
+ partially = true;
+
+ // Keep guichan window inside screen (supports resizing any side)
+
+ gcn::Rectangle winDimension = getDimension();
+
+ if (winDimension.x < 0)
+ {
+ winDimension.width += winDimension.x;
+ winDimension.x = 0;
+ }
+ if (winDimension.y < 0)
+ {
+ winDimension.height += winDimension.y;
+ winDimension.y = 0;
+ }
+
+ // Look if the window is partially off-screen limits...
+ if (partially)
+ {
+ if (winDimension.x + winDimension.width > graphics->getWidth())
+ {
+ winDimension.x = graphics->getWidth() - winDimension.width;
+ }
+
+ if (winDimension.y + winDimension.height > graphics->getHeight())
+ {
+ winDimension.y = graphics->getHeight() - winDimension.height;
+ }
+ setDimension(winDimension);
+ return;
+ }
+
+ if (entirely)
+ {
+ if (winDimension.x > graphics->getWidth())
+ {
+ winDimension.x = graphics->getWidth() - winDimension.width;
+ }
+
+ if (winDimension.y > graphics->getHeight())
+ {
+ winDimension.y = graphics->getHeight() - winDimension.height;
+ }
+ }
+ setDimension(winDimension);
+}
diff --git a/src/gui/widgets/window.h b/src/gui/widgets/window.h
index 153602ba..b3ef3fdc 100644
--- a/src/gui/widgets/window.h
+++ b/src/gui/widgets/window.h
@@ -269,7 +269,7 @@ class Window : public gcn::Window, gcn::WidgetListener
int defaultWidth, int defaultHeight);
/**
- * Set the default win pos and size tot he current ones.
+ * Set the default win pos and size to the current ones.
*/
void setDefaultSize();
@@ -347,6 +347,13 @@ class Window : public gcn::Window, gcn::WidgetListener
};
/**
+ * Check if the window is off-screen and then move it to be visible
+ * again. This is internally used by loadWindowState
+ * and setVisible(true) members.
+ */
+ void checkIfIsOffScreen(bool partially = true, bool entirely = true);
+
+ /**
* Determines if the mouse is in a resize area and returns appropriate
* resize handles. Also initializes drag offset in case the resize
* grip is used.