summaryrefslogtreecommitdiff
path: root/src/gui/widgets/tab.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets/tab.cpp')
-rw-r--r--src/gui/widgets/tab.cpp130
1 files changed, 18 insertions, 112 deletions
diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp
index d20e7993..1a857e55 100644
--- a/src/gui/widgets/tab.cpp
+++ b/src/gui/widgets/tab.cpp
@@ -21,141 +21,47 @@
#include "gui/widgets/tab.h"
-#include "configuration.h"
#include "graphics.h"
+#include "gui/gui.h"
#include "gui/widgets/tabbedarea.h"
-#include "resources/image.h"
#include "resources/theme.h"
-#include "utils/dtor.h"
-
#include <guichan/widgets/label.hpp>
-int Tab::mInstances = 0;
-float Tab::mAlpha = 1.0;
-
-enum {
- TAB_STANDARD, // 0
- TAB_HIGHLIGHTED, // 1
- TAB_SELECTED, // 2
- TAB_UNUSED, // 3
- TAB_COUNT // 4 - Must be last.
-};
-
-struct TabData
-{
- char const *file;
- int gridX[4];
- int gridY[4];
-};
-
-static TabData const data[TAB_COUNT] = {
- { "tab.png", {0, 9, 16, 25}, {0, 13, 19, 20} },
- { "tab_hilight.png", {0, 9, 16, 25}, {0, 13, 19, 20} },
- { "tabselected.png", {0, 9, 16, 25}, {0, 4, 12, 20} },
- { "tab.png", {0, 9, 16, 25}, {0, 13, 19, 20} }
-};
-
-ImageRect Tab::tabImg[TAB_COUNT];
-
Tab::Tab() :
mTabColor(&Theme::getThemeColor(Theme::TAB))
{
init();
}
-Tab::~Tab()
-{
- mInstances--;
-
- if (mInstances == 0)
- {
- for (auto &imgRect : tabImg)
- {
- std::for_each(imgRect.grid, imgRect.grid + 9, dtor<Image*>());
- }
- }
-}
-
void Tab::init()
{
setFocusable(false);
setFrameSize(0);
- mFlash = false;
-
- if (mInstances == 0)
- {
- // Load the skin
- for (int mode = 0; mode < TAB_COUNT; mode++)
- {
- auto tabImage = Theme::getImageFromTheme(data[mode].file);
- int a = 0;
- for (int y = 0; y < 3; y++)
- {
- for (int x = 0; x < 3; x++)
- {
- tabImg[mode].grid[a] = tabImage->getSubImage(
- data[mode].gridX[x], data[mode].gridY[y],
- data[mode].gridX[x + 1] - data[mode].gridX[x] + 1,
- data[mode].gridY[y + 1] - data[mode].gridY[y] + 1);
- a++;
- }
- }
- tabImg[mode].setAlpha(mAlpha);
- }
- }
- mInstances++;
-}
-
-void Tab::updateAlpha()
-{
- float alpha = std::max(config.guiAlpha,
- Theme::instance()->getMinimumOpacity());
-
- // TODO We don't need to do this for every tab on every draw
- // Maybe use a config listener to do it as the value changes.
- if (alpha != mAlpha)
- {
- mAlpha = alpha;
-
- for (auto &t : tabImg)
- {
- t.setAlpha(mAlpha);
- }
- }
}
void Tab::draw(gcn::Graphics *graphics)
{
- int mode = TAB_STANDARD;
-
- // check which type of tab to draw
- if (mTabbedArea)
- {
+ Theme::WidgetState state;
+ state.width = getWidth();
+ state.height = getHeight();
+ state.enabled = isEnabled();
+ state.hovered = mHasMouse;
+ state.selected = mTabbedArea && mTabbedArea->isTabSelected(this);
+ state.focused = isFocused();
+
+ gui->getTheme()->drawTab(static_cast<Graphics*>(graphics), state);
+
+ // if tab is selected, it doesnt need to highlight activity
+ if (state.selected)
+ mFlash = false;
+
+ if (mFlash)
+ mLabel->setForegroundColor(Theme::getThemeColor(Theme::TAB_FLASH));
+ else
mLabel->setForegroundColor(*mTabColor);
- if (mTabbedArea->isTabSelected(this))
- {
- mode = TAB_SELECTED;
- // if tab is selected, it doesnt need to highlight activity
- mFlash = false;
- }
- else if (mHasMouse)
- {
- mode = TAB_HIGHLIGHTED;
- }
- if (mFlash)
- {
- mLabel->setForegroundColor(Theme::getThemeColor(Theme::TAB_FLASH));
- }
- }
-
- updateAlpha();
-
- // draw tab
- static_cast<Graphics*>(graphics)->
- drawImageRect(0, 0, getWidth(), getHeight(), tabImg[mode]);
// draw label
drawChildren(graphics);