summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIra Rice <irarice@gmail.com>2009-02-03 14:38:40 -0700
committerIra Rice <irarice@gmail.com>2009-02-03 14:38:40 -0700
commit8857a59c3818c1ce6eeb6c054cb5543bfc35c087 (patch)
tree792fca4acae0c9372cf145a4f0b4cb995b1c3c78
parent6c5d9cd16b750ae9404407171a5641b5e0ee78b5 (diff)
downloadmana-8857a59c3818c1ce6eeb6c054cb5543bfc35c087.tar.gz
mana-8857a59c3818c1ce6eeb6c054cb5543bfc35c087.tar.bz2
mana-8857a59c3818c1ce6eeb6c054cb5543bfc35c087.tar.xz
mana-8857a59c3818c1ce6eeb6c054cb5543bfc35c087.zip
Fixed up table class to allow for different background colors, as well
as defining whether the given table is opaque or not. Signed-off-by: Ira Rice <irarice@gmail.com>
-rw-r--r--src/gui/setup_players.cpp3
-rw-r--r--src/gui/skill.cpp11
-rw-r--r--src/gui/skill.h1
-rw-r--r--src/gui/table.cpp139
-rw-r--r--src/gui/table.h28
-rw-r--r--src/gui/table_model.cpp28
-rw-r--r--src/gui/table_model.h33
7 files changed, 128 insertions, 115 deletions
diff --git a/src/gui/setup_players.cpp b/src/gui/setup_players.cpp
index a4582b48..c8546b4b 100644
--- a/src/gui/setup_players.cpp
+++ b/src/gui/setup_players.cpp
@@ -223,12 +223,13 @@ Setup_Players::Setup_Players():
mIgnoreActionChoicesBox(new gcn::DropDown(new IgnoreChoicesListModel()))
{
setOpaque(false);
+ mPlayerTable->setOpaque(false);
int table_width = NAME_COLUMN_WIDTH + RELATION_CHOICE_COLUMN_WIDTH;
mPlayerTableTitleModel->fixColumnWidth(NAME_COLUMN, NAME_COLUMN_WIDTH);
mPlayerTableTitleModel->fixColumnWidth(RELATION_CHOICE_COLUMN,
RELATION_CHOICE_COLUMN_WIDTH);
- mPlayerTitleTable->setDimension(gcn::Rectangle(10, 10, table_width, 10));
+ mPlayerTitleTable->setDimension(gcn::Rectangle(10, 10, table_width - 1, 10));
mPlayerTitleTable->setBackgroundColor(gcn::Color(0xbf, 0xbf, 0xbf));
for (int i = 0; i < COLUMNS_NR; i++)
diff --git a/src/gui/skill.cpp b/src/gui/skill.cpp
index 9d23cc3c..60f8ee65 100644
--- a/src/gui/skill.cpp
+++ b/src/gui/skill.cpp
@@ -53,7 +53,7 @@ class SkillGuiTableModel : public StaticTableModel
{
public:
SkillGuiTableModel(SkillDialog *dialog) :
- StaticTableModel(0, 3, 0xbdb5aa)
+ StaticTableModel(0, 3)
{
mEntriesNr = 0;
mDialog = dialog;
@@ -125,6 +125,7 @@ SkillDialog::SkillDialog():
initSkillinfo();
mTableModel = new SkillGuiTableModel(this);
mTable.setModel(mTableModel);
+ mTable.setOpaque(false);
mTable.setLinewiseSelection(true);
setWindowName(_("Skills"));
@@ -134,14 +135,12 @@ SkillDialog::SkillDialog():
setMinHeight(50 + mTableModel->getHeight());
setMinWidth(200);
-// mSkillListBox = new ListBox(this);
ScrollArea *skillScrollArea = new ScrollArea(&mTable);
mPointsLabel = new gcn::Label(strprintf(_("Skill points: %d"), 0));
mIncButton = new Button(_("Up"), _("inc"), this);
mUseButton = new Button(_("Use"), _("use"), this);
mUseButton->setEnabled(false);
-// mSkillListBox->setActionEventId("skill");
mTable.setActionEventId("skill");
skillScrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
@@ -155,7 +154,6 @@ SkillDialog::SkillDialog():
Layout &layout = getLayout();
layout.setRowHeight(0, Layout::AUTO_SET);
-// mSkillListBox->addActionListener(this);
mTable.addActionListener(this);
setLocationRelativeTo(getParent());
@@ -171,7 +169,7 @@ void SkillDialog::action(const gcn::ActionEvent &event)
if (event.getId() == "inc")
{
// Increment skill
- int selectedSkill = mTable.getSelectedRow();//mSkillListBox->getSelected();
+ int selectedSkill = mTable.getSelectedRow();
if (selectedSkill >= 0)
player_node->raiseSkill(mSkillList[selectedSkill]->id);
}
@@ -278,7 +276,8 @@ static void initSkillinfo(void)
std::string name = XML::getProperty(node, "name", "");
bool modifiable = !atoi(XML::getProperty(node, "fixed", "0").c_str());
- if (index >= 0) {
+ if (index >= 0)
+ {
skill_db.resize(index + 1, emptySkillInfo);
skill_db[index].name = name;
skill_db[index].modifiable = modifiable;
diff --git a/src/gui/skill.h b/src/gui/skill.h
index 955666d9..45cfd059 100644
--- a/src/gui/skill.h
+++ b/src/gui/skill.h
@@ -30,7 +30,6 @@
#include "scrollarea.h"
#include "table.h"
#include "window.h"
-#include "table.h"
#include "../guichanfwd.h"
diff --git a/src/gui/table.cpp b/src/gui/table.cpp
index c4265097..bccdc900 100644
--- a/src/gui/table.cpp
+++ b/src/gui/table.cpp
@@ -24,8 +24,13 @@
#include <guichan/graphics.hpp>
#include <guichan/actionlistener.hpp>
+#include "colour.h"
#include "table.h"
+#include "../configuration.h"
+
+float GuiTable::mAlpha = config.getValue("guialpha", 0.8);
+
class GuiTableActionListener : public gcn::ActionListener
{
public:
@@ -49,7 +54,8 @@ GuiTableActionListener::GuiTableActionListener(GuiTable *table, gcn::Widget *wid
mColumn(column),
mWidget(widget)
{
- if (widget) {
+ if (widget)
+ {
widget->addActionListener(this);
widget->_setParent(table);
}
@@ -57,7 +63,8 @@ GuiTableActionListener::GuiTableActionListener(GuiTable *table, gcn::Widget *wid
GuiTableActionListener::~GuiTableActionListener(void)
{
- if (mWidget) {
+ if (mWidget)
+ {
mWidget->removeActionListener(this);
mWidget->_setParent(NULL);
}
@@ -70,8 +77,11 @@ void GuiTableActionListener::action(const gcn::ActionEvent& actionEvent)
}
-GuiTable::GuiTable(TableModel *initial_model) :
+GuiTable::GuiTable(TableModel *initial_model, gcn::Color background,
+ bool opacity) :
mLinewiseMode(false),
+ mOpaque(opacity),
+ mBackgroundColor(background),
mModel(NULL),
mSelectedRow(0),
mSelectedColumn(0),
@@ -94,16 +104,17 @@ TableModel* GuiTable::getModel(void) const
void GuiTable::setModel(TableModel *new_model)
{
- if (mModel) {
+ if (mModel)
+ {
uninstallActionListeners();
mModel->removeListener(this);
}
-
mModel = new_model;
installActionListeners();
- if (new_model) {
+ if (new_model)
+ {
new_model->installListener(this);
recomputeDimensions();
}
@@ -184,10 +195,11 @@ void GuiTable::installActionListeners(void)
int columns = mModel->getColumns();
for (int row = 0; row < rows; ++row)
- for (int column = 0; column < columns; ++column) {
+ for (int column = 0; column < columns; ++column)
+ {
gcn::Widget *widget = mModel->getElementAt(row, column);
action_listeners.push_back(new GuiTableActionListener(this, widget,
- row, column));
+ row, column));
}
_setFocusHandler(_getFocusHandler()); // propagate focus handler to widgets
@@ -196,12 +208,22 @@ void GuiTable::installActionListeners(void)
// -- widget ops
void GuiTable::draw(gcn::Graphics* graphics)
{
- graphics->setColor(getBackgroundColor());
- graphics->fillRectangle(gcn::Rectangle(0, 0, getWidth(), getHeight()));
-
if (!mModel)
return;
+ if (config.getValue("guialpha", 0.8) != mAlpha)
+ mAlpha = config.getValue("guialpha", 0.8);
+
+ if (mOpaque)
+ {
+ const int red = getBackgroundColor().r;
+ const int green = getBackgroundColor().g;
+ const int blue = getBackgroundColor().b;
+ const int alpha = mAlpha * 255;
+ graphics->setColor(gcn::Color(red, green, blue, alpha));
+ graphics->fillRectangle(gcn::Rectangle(0, 0, getWidth(), getHeight()));
+ }
+
// First, determine how many rows we need to draw, and where we should start.
int first_row = -(getY() / getRowHeight());
@@ -223,44 +245,68 @@ void GuiTable::draw(gcn::Graphics* graphics)
int height = getRowHeight();
int y_offset = first_row * height;
- for (int r = first_row; r < first_row + rows_nr; ++r) {
+ for (int r = first_row; r < first_row + rows_nr; ++r)
+ {
int x_offset = 0;
- for (int c = first_column; c <= last_column; ++c) {
+ for (int c = first_column; c <= last_column; ++c)
+ {
gcn::Widget *widget = mModel->getElementAt(r, c);
int width = getColumnWidth(c);
- if (widget) {
+ if (widget)
+ {
gcn::Rectangle bounds(x_offset, y_offset, width, height);
- if (widget == mTopWidget) {
+ if (widget == mTopWidget)
+ {
bounds.height = widget->getHeight();
bounds.width = widget->getWidth();
}
widget->setDimension(bounds);
+ if (!mLinewiseMode && c == mSelectedColumn && r == mSelectedRow)
+ {
+ bool valid;
+ const int red =
+ (textColour->getColour('H', valid) >> 16) & 0xFF;
+ const int green =
+ (textColour->getColour('H', valid) >> 8) & 0xFF;
+ const int blue = textColour->getColour('H', valid) & 0xFF;
+ const int alpha = mAlpha * 127;
+
+ graphics->setColor(gcn::Color(red, green, blue, alpha));
+ graphics->fillRectangle(bounds);
+ }
+
graphics->pushClipArea(bounds);
widget->draw(graphics);
graphics->popClipArea();
-
- if (!mLinewiseMode
- && c == mSelectedColumn
- && r == mSelectedRow)
- graphics->drawRectangle(bounds);
}
x_offset += width;
}
- if (mLinewiseMode
- && r == mSelectedRow)
- graphics->drawRectangle(gcn::Rectangle(0, y_offset,
+ if (mLinewiseMode && r == mSelectedRow)
+ {
+ bool valid;
+ const int red =
+ (textColour->getColour('H', valid) >> 16) & 0xFF;
+ const int green =
+ (textColour->getColour('H', valid) >> 8) & 0xFF;
+ const int blue = textColour->getColour('H', valid) & 0xFF;
+ const int alpha = mAlpha * 127;
+
+ graphics->setColor(gcn::Color(red, green, blue, alpha));
+ graphics->fillRectangle(gcn::Rectangle(0, y_offset,
x_offset, height));
+ }
y_offset += height;
}
- if (mTopWidget) {
+ if (mTopWidget)
+ {
gcn::Rectangle bounds = mTopWidget->getDimension();
graphics->pushClipArea(bounds);
mTopWidget->draw(graphics);
@@ -268,21 +314,17 @@ void GuiTable::draw(gcn::Graphics* graphics)
}
}
-void GuiTable::logic(void)
-{
-}
-
void GuiTable::moveToTop(gcn::Widget *widget)
{
gcn::Widget::moveToTop(widget);
- this->mTopWidget = widget;
+ mTopWidget = widget;
}
void GuiTable::moveToBottom(gcn::Widget *widget)
{
gcn::Widget::moveToBottom(widget);
- if (widget == this->mTopWidget)
- this->mTopWidget = NULL;
+ if (widget == mTopWidget)
+ mTopWidget = NULL;
}
gcn::Rectangle GuiTable::getChildrenArea(void)
@@ -298,11 +340,13 @@ void GuiTable::keyPressed(gcn::KeyEvent& keyEvent)
// -- MouseListener notifications
void GuiTable::mousePressed(gcn::MouseEvent& mouseEvent)
{
- if (mouseEvent.getButton() == gcn::MouseEvent::LEFT) {
+ if (mouseEvent.getButton() == gcn::MouseEvent::LEFT)
+ {
int row = getRowForY(mouseEvent.getY());
int column = getColumnForX(mouseEvent.getX());
- if (row > -1 && column > -1) {
+ if (row > -1 && column > -1)
+ {
mSelectedColumn = column;
mSelectedRow = row;
}
@@ -326,10 +370,13 @@ void GuiTable::mouseDragged(gcn::MouseEvent& mouseEvent)
// -- TableModelListener notifications
void GuiTable::modelUpdated(bool completed)
{
- if (completed) {
+ if (completed)
+ {
recomputeDimensions();
installActionListeners();
- } else { // before the update?
+ }
+ else
+ { // before the update?
mTopWidget = NULL; // No longer valid in general
uninstallActionListeners();
}
@@ -340,18 +387,18 @@ gcn::Widget* GuiTable::getWidgetAt(int x, int y)
int row = getRowForY(y);
int column = getColumnForX(x);
- if (mTopWidget
- && mTopWidget->getDimension().isPointInRect(x, y))
+ if (mTopWidget && mTopWidget->getDimension().isPointInRect(x, y))
return mTopWidget;
- if (row > -1
- && column > -1) {
+ if (row > -1 && column > -1)
+ {
gcn::Widget *w = mModel->getElementAt(row, column);
if (w && w->isFocusable())
return w;
else
return NULL; // Grab the event locally
- } else
+ }
+ else
return NULL;
}
@@ -359,8 +406,7 @@ int GuiTable::getRowForY(int y)
{
int row = y / getRowHeight();
- if (row < 0
- || row >= mModel->getRows())
+ if (row < 0 || row >= mModel->getRows())
return -1;
else
return row;
@@ -371,14 +417,14 @@ int GuiTable::getColumnForX(int x)
int column;
int delta = 0;
- for (column = 0; column < mModel->getColumns(); column++) {
+ for (column = 0; column < mModel->getColumns(); column++)
+ {
delta += getColumnWidth(column);
if (x <= delta)
break;
}
- if (column < 0
- || column >= mModel->getColumns())
+ if (column < 0 || column >= mModel->getColumns())
return -1;
else
return column;
@@ -390,7 +436,8 @@ void GuiTable::_setFocusHandler(gcn::FocusHandler* focusHandler)
if (mModel)
for (int r = 0; r < mModel->getRows(); ++r)
- for (int c = 0; c < mModel->getColumns(); ++c) {
+ for (int c = 0; c < mModel->getColumns(); ++c)
+ {
gcn::Widget *w = mModel->getElementAt(r, c);
if (w)
w->_setFocusHandler(focusHandler);
diff --git a/src/gui/table.h b/src/gui/table.h
index e3fd8cf6..bdb41e90 100644
--- a/src/gui/table.h
+++ b/src/gui/table.h
@@ -51,7 +51,8 @@ class GuiTable : public gcn::Widget,
{
friend class GuiTableActionListener; // so that the action listener can call distributeActionEvent
public:
- GuiTable(TableModel * initial_model = NULL);
+ GuiTable(TableModel * initial_model = NULL, gcn::Color background = 0xffffff,
+ bool opacity = true);
virtual ~GuiTable(void);
@@ -94,8 +95,6 @@ public:
// Inherited from Widget
virtual void draw(gcn::Graphics* graphics);
- virtual void logic(void);
-
virtual gcn::Widget *getWidgetAt(int x, int y);
virtual void moveToTop(gcn::Widget *child);
@@ -107,6 +106,21 @@ public:
// Inherited from KeyListener
virtual void keyPressed(gcn::KeyEvent& keyEvent);
+ /**
+ * Sets the table to be opaque, that is sets the table
+ * to display its background.
+ *
+ * @param opaque True if the table should be opaque, false otherwise.
+ */
+ virtual void setOpaque(bool opaque) {mOpaque = opaque;}
+
+ /**
+ * Checks if the table is opaque, that is if the table area displays its
+ * background.
+ *
+ * @return True if the table is opaque, false otherwise.
+ */
+ virtual bool isOpaque() const {return mOpaque;}
// Inherited from MouseListener
virtual void mousePressed(gcn::MouseEvent& mouseEvent);
@@ -134,6 +148,14 @@ private:
int getColumnForX(int x); // -1 on error
void recomputeDimensions(void);
bool mLinewiseMode;
+ bool mOpaque;
+
+ static float mAlpha;
+
+ /**
+ * Holds the background color of the table.
+ */
+ gcn::Color mBackgroundColor;
TableModel *mModel;
diff --git a/src/gui/table_model.cpp b/src/gui/table_model.cpp
index 0b31369f..5ee7e9ab 100644
--- a/src/gui/table_model.cpp
+++ b/src/gui/table_model.cpp
@@ -54,13 +54,10 @@ void TableModel::signalAfterUpdate(void)
#define WIDGET_AT(row, column) (((row) * mColumns) + (column))
#define DYN_SIZE(h) ((h) >= 0) // determines whether this size is tagged for auto-detection
-StaticTableModel::StaticTableModel(int row, int column,
- gcn::Color backgroundColor, bool opacity) :
+StaticTableModel::StaticTableModel(int row, int column) :
mRows(row),
mColumns(column),
- mHeight(1),
- mOpaque(opacity),
- mBackgroundColor(backgroundColor)
+ mHeight(1)
{
mTableModel.resize(row * column, NULL);
mWidths.resize(column, 1);
@@ -165,24 +162,3 @@ int StaticTableModel::getHeight(void)
return (mColumns * mHeight);
}
-void StaticTableModel::drawBackground(gcn::Graphics *graphics)
-{
- if (isOpaque())
- {
- for (unsigned int i = 0; i < mTableModel.size(); i++)
- {
- mTableModel[i]->setBackgroundColor(mBackgroundColor);
- }
- }
-}
-
-void StaticTableModel::setOpaque(bool opaque)
-{
- mOpaque = opaque;
-}
-
-bool StaticTableModel::isOpaque() const
-{
- return mOpaque;
-}
-
diff --git a/src/gui/table_model.h b/src/gui/table_model.h
index 1c36ca46..a2a93887 100644
--- a/src/gui/table_model.h
+++ b/src/gui/table_model.h
@@ -100,8 +100,7 @@ private:
class StaticTableModel : public TableModel
{
public:
- StaticTableModel(int width, int height, gcn::Color background = 0xffffff,
- bool opacity = true);
+ StaticTableModel(int width, int height);
virtual ~StaticTableModel(void);
/**
@@ -130,22 +129,6 @@ public:
*/
virtual void resize(void);
- /**
- * Sets the table to be opaque, that is sets the table
- * to display its background.
- *
- * @param opaque True if the table should be opaque, false otherwise.
- */
- virtual void setOpaque(bool opaque);
-
- /**
- * Checks if the scroll area is opaque, that is if the scroll area
- * displays its background.
- *
- * @return True if the scroll area is opaque, false otherwise.
- */
- virtual bool isOpaque() const;
-
virtual int getRows(void);
virtual int getColumns(void);
virtual int getRowHeight(void);
@@ -158,22 +141,8 @@ public:
protected:
int mRows, mColumns;
int mHeight;
- bool mOpaque;
std::vector<gcn::Widget *> mTableModel;
std::vector<int> mWidths;
-
- /**
- * Holds the background color of the table.
- */
- gcn::Color mBackgroundColor;
-
- /**
- * Draws the background of the table, that is
- * the area behind the content.
- *
- * @param graphics a Graphics object to draw with.
- */
- virtual void drawBackground(gcn::Graphics *graphics);
};
#endif /* !defined(TABLE_MODEL_H) */