diff options
author | Ira Rice <irarice@gmail.com> | 2009-02-03 14:38:40 -0700 |
---|---|---|
committer | Ira Rice <irarice@gmail.com> | 2009-02-03 14:38:40 -0700 |
commit | 8857a59c3818c1ce6eeb6c054cb5543bfc35c087 (patch) | |
tree | 792fca4acae0c9372cf145a4f0b4cb995b1c3c78 | |
parent | 6c5d9cd16b750ae9404407171a5641b5e0ee78b5 (diff) | |
download | mana-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.cpp | 3 | ||||
-rw-r--r-- | src/gui/skill.cpp | 11 | ||||
-rw-r--r-- | src/gui/skill.h | 1 | ||||
-rw-r--r-- | src/gui/table.cpp | 139 | ||||
-rw-r--r-- | src/gui/table.h | 28 | ||||
-rw-r--r-- | src/gui/table_model.cpp | 28 | ||||
-rw-r--r-- | src/gui/table_model.h | 33 |
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) */ |