diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/charselectdialog.cpp | 180 | ||||
-rw-r--r-- | src/gui/charselectdialog.h | 7 |
2 files changed, 168 insertions, 19 deletions
diff --git a/src/gui/charselectdialog.cpp b/src/gui/charselectdialog.cpp index f87bb6b93..c127f9bf8 100644 --- a/src/gui/charselectdialog.cpp +++ b/src/gui/charselectdialog.cpp @@ -135,6 +135,101 @@ class CharacterDisplay final : public Container Button *mDelete; }; +class CharacterScroller final : public Container, + public gcn::ActionListener +{ + public: + CharacterScroller(CharSelectDialog *widget, + std::vector<CharacterDisplay*> *entries) : + Container(widget), + gcn::ActionListener(), + mSelectedEntry(nullptr), + mPrevious(new Button(this, "<", "prev", this)), + mNext(new Button(this, ">", "next", this)), + mNumber(new Label(this, "??")), + mSelected(0), + mCharacterEntries(entries) + { + addKeyListener(widget); + if (entries) + { + FOR_EACHP (std::vector<CharacterDisplay*>::iterator, + it, entries) + { + CharacterDisplay *character = *it; + add(character); + } + show(0); + } + add(mPrevious); + add(mNext); + add(mNumber); + } + + void show(const int i) + { + const int sz = (signed)mCharacterEntries->size(); + if (mSelectedEntry) + mSelectedEntry->setVisible(false); + if (i >= sz) + mSelected = 0; + else if (i < 0) + mSelected = mCharacterEntries->size() - 1; + else + mSelected = i; + mSelectedEntry = (*mCharacterEntries)[mSelected]; + mSelectedEntry->setVisible(true); + mNumber->setCaption(strprintf("%d / %d", mSelected + 1, sz)); + mNumber->adjustSize(); + } + + void resize() + { + CharacterDisplay *firtChar = (*mCharacterEntries)[0]; + const int x = (getWidth() - firtChar->getWidth()) / 2; + const int y = (getHeight() - firtChar->getHeight()) / 2; + FOR_EACHP (std::vector<CharacterDisplay*>::iterator, + it, mCharacterEntries) + { + CharacterDisplay *character = *it; + character->setPosition(x, y); + } + const int y2 = (getHeight() - mPrevious->getHeight()) / 2; + const int y3 = y2 - 55; + mPrevious->setPosition(x - mPrevious->getWidth() - 10, y3); + mNext->setPosition(getWidth() - x + 10, y3); + mNumber->setPosition(10, y2); + } + + void action(const gcn::ActionEvent &event) override + { + const std::string &eventId = event.getId(); + if (eventId == "next") + { + mSelected ++; + show(mSelected); + } + else if (eventId == "prev") + { + mSelected --; + show(mSelected); + } + } + + int getSelected() + { + return mSelected; + } + + private: + CharacterDisplay *mSelectedEntry; + Button *mPrevious; + Button *mNext; + Label *mNumber; + int mSelected; + std::vector<CharacterDisplay*> *mCharacterEntries; +}; + CharSelectDialog::CharSelectDialog(LoginData *const data): Window(_("Account and Character Management"), false, nullptr, "char.xml"), gcn::ActionListener(), @@ -148,10 +243,13 @@ CharSelectDialog::CharSelectDialog(LoginData *const data): "change_password", this)), mUnregisterButton(nullptr), mChangeEmailButton(nullptr), + mCharacterScroller(nullptr), mCharacterEntries(0), mCharHandler(Net::getCharHandler()), mDeleteDialog(nullptr), - mDeleteIndex(-1) + mDeleteIndex(-1), + mSmallScreen(mainGraphics->getWidth() < 485 + || mainGraphics->getHeight() < 485) { setCloseButton(true); @@ -186,12 +284,30 @@ CharSelectDialog::CharSelectDialog(LoginData *const data): } placer = getPlacer(0, 1); - - for (int i = 0; i < static_cast<int>(mLoginData->characterSlots); i++) + if (!mSmallScreen) { - mCharacterEntries.push_back(new CharacterDisplay(this, this)); - placer(i % SLOTS_PER_ROW, static_cast<int>(i) / SLOTS_PER_ROW, - mCharacterEntries[i]); + for (int i = 0; i < static_cast<int>(mLoginData->characterSlots); i++) + { + mCharacterEntries.push_back(new CharacterDisplay(this, this)); + placer(i % SLOTS_PER_ROW, static_cast<int>(i) / SLOTS_PER_ROW, + mCharacterEntries[i]); + } + } + else + { + for (int i = 0; i < static_cast<int>(mLoginData->characterSlots); i++) + { + CharacterDisplay *character = new CharacterDisplay(this, this); + character->setVisible(false); + mCharacterEntries.push_back(character); +// placer(i % SLOTS_PER_ROW, static_cast<int>(i) / SLOTS_PER_ROW, +// mCharacterEntries[i]); + } + mCharacterScroller = new CharacterScroller(this, &mCharacterEntries); + mCharacterScroller->setWidth(mainGraphics->getWidth() - 2 * getPadding()); + mCharacterScroller->setHeight(200); + placer(0, 0, mCharacterScroller); +// placer(0, 0, mCharacterEntries[0]); } reflowLayout(); @@ -202,8 +318,7 @@ CharSelectDialog::CharSelectDialog(LoginData *const data): setVisible(true); Net::getCharHandler()->setCharSelectDialog(this); - if (mCharacterEntries[0]) - mCharacterEntries[0]->requestFocus(); + focusCharacter(0); } CharSelectDialog::~CharSelectDialog() @@ -216,13 +331,20 @@ void CharSelectDialog::action(const gcn::ActionEvent &event) // Check if a button of a character was pressed const gcn::Widget *const sourceParent = event.getSource()->getParent(); int selected = -1; - for (unsigned int i = 0, sz = static_cast<unsigned int>( - mCharacterEntries.size()); i < sz; ++i) + if (mCharacterScroller) + { + selected = mCharacterScroller->getSelected(); + } + else { - if (mCharacterEntries[i] == sourceParent) + for (unsigned int i = 0, sz = static_cast<unsigned int>( + mCharacterEntries.size()); i < sz; ++i) { - selected = i; - break; + if (mCharacterEntries[i] == sourceParent) + { + selected = i; + break; + } } } @@ -230,9 +352,10 @@ void CharSelectDialog::action(const gcn::ActionEvent &event) if (selected >= 0) { - if (eventId == "use") + if (eventId == "use" && mCharacterEntries[selected]->getCharacter()) { attemptCharacterSelect(selected); + return; } else if (eventId == "new" && !mCharacterEntries[selected]->getCharacter()) @@ -241,14 +364,16 @@ void CharSelectDialog::action(const gcn::ActionEvent &event) CharCreateDialog *const charCreateDialog = new CharCreateDialog(this, selected); mCharHandler->setCharCreateDialog(charCreateDialog); + return; } else if (eventId == "delete" && mCharacterEntries[selected]->getCharacter()) { new CharDeleteConfirm(this, selected); + return; } } - else if (eventId == "switch") + if (eventId == "switch") { close(); } @@ -293,6 +418,8 @@ void CharSelectDialog::keyPressed(gcn::KeyEvent &keyEvent) case Input::KEY_GUI_RIGHT: { + if (mCharacterScroller) + return; keyEvent.consume(); int idx; int idx2; @@ -308,6 +435,8 @@ void CharSelectDialog::keyPressed(gcn::KeyEvent &keyEvent) case Input::KEY_GUI_LEFT: { + if (mCharacterScroller) + return; keyEvent.consume(); int idx; int idx2; @@ -334,7 +463,7 @@ void CharSelectDialog::keyPressed(gcn::KeyEvent &keyEvent) { idx2 = 0; } - else + else if (!mCharacterScroller) { idx -= SLOTS_PER_ROW; if (mCharacterEntries[idx]->getCharacter()) @@ -361,7 +490,7 @@ void CharSelectDialog::keyPressed(gcn::KeyEvent &keyEvent) idx += SLOTS_PER_ROW; idx2 = 0; } - else + else if (!mCharacterScroller) { if (mCharacterEntries[idx]->getCharacter()) idx2 = 1; @@ -544,8 +673,7 @@ bool CharSelectDialog::selectByName(const std::string &name, { if (character->dummy && character->dummy->getName() == name) { - if (mCharacterEntries[i]) - mCharacterEntries[i]->requestFocus(); + focusCharacter(i); if (selAction == Choose) attemptCharacterSelect(static_cast<int>(i)); return true; @@ -563,6 +691,20 @@ void CharSelectDialog::close() Window::close(); } +void CharSelectDialog::focusCharacter(const int i) +{ + if (mCharacterEntries[i]) + mCharacterEntries[i]->requestFocus(); + if (mCharacterScroller) + mCharacterScroller->show(i); +} + +void CharSelectDialog::widgetResized(const gcn::Event &event) +{ + Window::widgetResized(event); + if (mCharacterScroller) + mCharacterScroller->resize(); +} CharacterDisplay::CharacterDisplay(const Widget2 *const widget, CharSelectDialog *const charSelectDialog) : diff --git a/src/gui/charselectdialog.h b/src/gui/charselectdialog.h index c43bcca09..f9030d561 100644 --- a/src/gui/charselectdialog.h +++ b/src/gui/charselectdialog.h @@ -35,6 +35,7 @@ class Button; class CharacterDisplay; +class CharacterScroller; class Label; class LocalPlayer; class LoginData; @@ -93,6 +94,10 @@ class CharSelectDialog final : public Window, void close() override; + void focusCharacter(int i); + + void widgetResized(const gcn::Event &event) override; + private: void attemptCharacterDelete(const int index); @@ -119,6 +124,7 @@ class CharSelectDialog final : public Window, Button *mChangePasswordButton; Button *mUnregisterButton; Button *mChangeEmailButton; + CharacterScroller *mCharacterScroller; /** The player boxes */ std::vector<CharacterDisplay*> mCharacterEntries; @@ -126,6 +132,7 @@ class CharSelectDialog final : public Window, Net::CharHandler *mCharHandler; TextDialog *mDeleteDialog; int mDeleteIndex; + bool mSmallScreen; }; #endif |