diff options
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/gui/models/playertablemodel.cpp | 151 | ||||
-rw-r--r-- | src/gui/models/playertablemodel.h | 68 | ||||
-rw-r--r-- | src/gui/widgets/tabs/setup_relations.cpp | 133 |
5 files changed, 230 insertions, 126 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 63e763db6..267a146f4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -198,6 +198,8 @@ SET(SRCS gui/models/namesmodel.cpp gui/models/namesmodel.h gui/models/playerrelationlistmodel.h + gui/models/playertablemodel.cpp + gui/models/playertablemodel.h gui/models/questsmodel.h gui/models/serverslistmodel.h gui/widgets/passwordfield.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 69f87a2fe..516292e55 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -291,6 +291,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ gui/models/namesmodel.cpp \ gui/models/namesmodel.h \ gui/models/playerrelationlistmodel.h \ + gui/models/playertablemodel.cpp \ + gui/models/playertablemodel.h \ gui/models/questsmodel.h \ gui/models/serverslistmodel.h \ gui/widgets/passwordfield.cpp \ diff --git a/src/gui/models/playertablemodel.cpp b/src/gui/models/playertablemodel.cpp new file mode 100644 index 000000000..d3d198eb1 --- /dev/null +++ b/src/gui/models/playertablemodel.cpp @@ -0,0 +1,151 @@ +/* + * The ManaPlus Client + * Copyright (C) 2008-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2014 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#include "gui/models/playertablemodel.h" + +#include "gui/widgets/dropdown.h" +#include "gui/widgets/label.h" + +#include "gui/widgets/tabs/setup_relations.h" + +#include "gui/models/playerrelationlistmodel.h" +#include "gui/models/tablemodel.h" + +#include "utils/delete2.h" +#include "utils/dtor.h" +#include "utils/gettext.h" + +#include "debug.h" + +static const int COLUMNS_NR = 2; // name plus listbox +static const int NAME_COLUMN = 0; +static const unsigned int RELATION_CHOICE_COLUMN = 1; + +static const unsigned int ROW_HEIGHT = 12; +// The following column widths really shouldn't be hardcoded +// but should scale with the size of the widget... except +// that, right now, the widget doesn't exactly scale either. +static const unsigned int NAME_COLUMN_WIDTH = 230; +static const unsigned int RELATION_CHOICE_COLUMN_WIDTH = 80; + +#define WIDGET_AT(row, column) (((row) * COLUMNS_NR) + column) + +PlayerTableModel::PlayerTableModel(const Widget2 *const widget) : + Widget2(widget), + TableModel(), + mPlayers(nullptr), + mWidgets(), + mListModel(new PlayerRelationListModel) +{ + playerRelationsUpdated(); +} + +PlayerTableModel::~PlayerTableModel() +{ + freeWidgets(); + delete2(mListModel) + delete2(mPlayers) +} + +int PlayerTableModel::getRows() const +{ + if (mPlayers) + return static_cast<int>(mPlayers->size()); + else + return 0; +} + +int PlayerTableModel::getColumns() const +{ + return COLUMNS_NR; +} + +int PlayerTableModel::getRowHeight() const +{ + return ROW_HEIGHT; +} + +int PlayerTableModel::getColumnWidth(const int index) const +{ + if (index == NAME_COLUMN) + return NAME_COLUMN_WIDTH; + else + return RELATION_CHOICE_COLUMN_WIDTH; +} + +void PlayerTableModel::playerRelationsUpdated() +{ + signalBeforeUpdate(); + + freeWidgets(); + StringVect *const player_names = player_relations.getPlayers(); + + if (!player_names) + return; + + delete mPlayers; + mPlayers = player_names; + + // set up widgets + for (unsigned int r = 0, sz = static_cast<unsigned int>( + player_names->size()); r < sz; ++r) + { + const std::string name = (*player_names)[r]; + Widget *const widget = new Label(this, name); + mWidgets.push_back(widget); + + DropDown *const choicebox = new DropDown(this, mListModel); + choicebox->setSelected(static_cast<int>( + player_relations.getRelation(name))); + mWidgets.push_back(choicebox); + } + + signalAfterUpdate(); +} + +void PlayerTableModel::updateModelInRow(const int row) const +{ + const DropDown *const choicebox = static_cast<DropDown *>( + getElementAt(row, RELATION_CHOICE_COLUMN)); + player_relations.setRelation(getPlayerAt(row), + static_cast<PlayerRelation::Relation>( + choicebox->getSelected())); +} + +Widget *PlayerTableModel::getElementAt(int row, int column) const +{ + return mWidgets[WIDGET_AT(row, column)]; +} + +void PlayerTableModel::freeWidgets() +{ + delete2(mPlayers) + delete_all(mWidgets); + mWidgets.clear(); +} + +std::string PlayerTableModel::getPlayerAt(const int index) const +{ + if (index < 0 || index >= static_cast<signed>(mPlayers->size())) + return ""; + return (*mPlayers)[index]; +} diff --git a/src/gui/models/playertablemodel.h b/src/gui/models/playertablemodel.h new file mode 100644 index 000000000..2616d9c87 --- /dev/null +++ b/src/gui/models/playertablemodel.h @@ -0,0 +1,68 @@ +/* + * The ManaPlus Client + * Copyright (C) 2008-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2014 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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, see <http://www.gnu.org/licenses/>. + */ + +#ifndef GUI_MODELS_PLAYERTABLEMODEL_H +#define GUI_MODELS_PLAYERTABLEMODEL_H + +#include "gui/widgets/widget2.h" + +#include "gui/models/tablemodel.h" + +#include "localconsts.h" + +class PlayerRelationListModel; + +class PlayerTableModel final : public Widget2, + public TableModel +{ + public: + explicit PlayerTableModel(const Widget2 *const widget); + + A_DELETE_COPY(PlayerTableModel) + + ~PlayerTableModel(); + + int getRows() const override final; + + int getColumns() const override final; + + int getRowHeight() const override final; + + int getColumnWidth(const int index) const override final; + + void playerRelationsUpdated(); + + void updateModelInRow(const int row) const; + + Widget *getElementAt(int row, int column) const override final; + + void freeWidgets(); + + std::string getPlayerAt(const int index) const; + + protected: + StringVect *mPlayers; + std::vector<Widget *> mWidgets; + PlayerRelationListModel *mListModel; +}; + +#endif // GUI_MODELS_PLAYERTABLEMODEL_H diff --git a/src/gui/widgets/tabs/setup_relations.cpp b/src/gui/widgets/tabs/setup_relations.cpp index c6b820ec0..4dcce4b9c 100644 --- a/src/gui/widgets/tabs/setup_relations.cpp +++ b/src/gui/widgets/tabs/setup_relations.cpp @@ -28,6 +28,7 @@ #include "gui/models/ignorechoiceslistmodel.h" #include "gui/models/playerrelationlistmodel.h" +#include "gui/models/playertablemodel.h" #include "gui/widgets/button.h" #include "gui/widgets/checkbox.h" @@ -42,20 +43,17 @@ #include "utils/dtor.h" #include "utils/gettext.h" +#include "debug.h" + static const int COLUMNS_NR = 2; // name plus listbox static const int NAME_COLUMN = 0; -static const unsigned int RELATION_CHOICE_COLUMN = 1; - -static const unsigned int ROW_HEIGHT = 12; -// The following column widths really shouldn't be hardcoded -// but should scale with the size of the widget... except -// that, right now, the widget doesn't exactly scale either. static const unsigned int NAME_COLUMN_WIDTH = 230; +static const unsigned int RELATION_CHOICE_COLUMN = 1; static const unsigned int RELATION_CHOICE_COLUMN_WIDTH = 80; -#define WIDGET_AT(row, column) (((row) * COLUMNS_NR) + column) - -#include "debug.h" +static const std::string ACTION_DELETE("delete"); +static const std::string ACTION_TABLE("table"); +static const std::string ACTION_STRATEGY("strategy"); static const char *const table_titles[COLUMNS_NR] = { @@ -65,123 +63,6 @@ static const char *const table_titles[COLUMNS_NR] = N_("Relation") }; -class PlayerTableModel final : public Widget2, public TableModel -{ -public: - explicit PlayerTableModel(const Widget2 *const widget) : - Widget2(widget), - TableModel(), - mPlayers(nullptr), - mWidgets(), - mListModel(new PlayerRelationListModel) - { - playerRelationsUpdated(); - } - - A_DELETE_COPY(PlayerTableModel) - - ~PlayerTableModel() - { - freeWidgets(); - delete2(mListModel) - delete2(mPlayers) - } - - int getRows() const override final - { - if (mPlayers) - return static_cast<int>(mPlayers->size()); - else - return 0; - } - - int getColumns() const override final - { - return COLUMNS_NR; - } - - int getRowHeight() const override final - { - return ROW_HEIGHT; - } - - int getColumnWidth(const int index) const override final - { - if (index == NAME_COLUMN) - return NAME_COLUMN_WIDTH; - else - return RELATION_CHOICE_COLUMN_WIDTH; - } - - void playerRelationsUpdated() - { - signalBeforeUpdate(); - - freeWidgets(); - StringVect *const player_names = player_relations.getPlayers(); - - if (!player_names) - return; - - delete mPlayers; - mPlayers = player_names; - - // set up widgets - for (unsigned int r = 0, sz = static_cast<unsigned int>( - player_names->size()); r < sz; ++r) - { - const std::string name = (*player_names)[r]; - Widget *const widget = new Label(this, name); - mWidgets.push_back(widget); - - DropDown *const choicebox = new DropDown(this, mListModel); - choicebox->setSelected(static_cast<int>( - player_relations.getRelation(name))); - mWidgets.push_back(choicebox); - } - - signalAfterUpdate(); - } - - void updateModelInRow(const int row) const - { - const DropDown *const choicebox = static_cast<DropDown *>( - getElementAt(row, RELATION_CHOICE_COLUMN)); - player_relations.setRelation(getPlayerAt(row), - static_cast<PlayerRelation::Relation>( - choicebox->getSelected())); - } - - - Widget *getElementAt(int row, int column) const override final - { - return mWidgets[WIDGET_AT(row, column)]; - } - - void freeWidgets() - { - delete2(mPlayers) - delete_all(mWidgets); - mWidgets.clear(); - } - - std::string getPlayerAt(const int index) const - { - if (index < 0 || index >= static_cast<signed>(mPlayers->size())) - return ""; - return (*mPlayers)[index]; - } - -protected: - StringVect *mPlayers; - std::vector<Widget *> mWidgets; - PlayerRelationListModel *mListModel; -}; - -static const std::string ACTION_DELETE("delete"); -static const std::string ACTION_TABLE("table"); -static const std::string ACTION_STRATEGY("strategy"); - Setup_Relations::Setup_Relations(const Widget2 *const widget) : SetupTab(widget), PlayerRelationsListener(), |