diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/npcdialog.cpp | 198 | ||||
-rw-r--r-- | src/gui/npcdialog.h | 21 | ||||
-rw-r--r-- | src/gui/widgets/playerbox.cpp | 2 | ||||
-rw-r--r-- | src/gui/widgets/playerbox.h | 9 |
4 files changed, 201 insertions, 29 deletions
diff --git a/src/gui/npcdialog.cpp b/src/gui/npcdialog.cpp index ffd8e8e2d..ec76ea3f5 100644 --- a/src/gui/npcdialog.cpp +++ b/src/gui/npcdialog.cpp @@ -22,6 +22,7 @@ #include "gui/npcdialog.h" +#include "being.h" #include "configuration.h" #include "client.h" @@ -37,6 +38,7 @@ #include "gui/widgets/itemlinkhandler.h" #include "gui/widgets/layout.h" #include "gui/widgets/listbox.h" +#include "gui/widgets/playerbox.h" #include "gui/widgets/scrollarea.h" #include "gui/widgets/textbox.h" #include "gui/widgets/textfield.h" @@ -68,7 +70,10 @@ NpcDialog::NpcDialog(int npcId) : mLastNextTime(0), mCameraMode(-1), mCameraX(0), - mCameraY(0) + mCameraY(0), + mPlayerBox(new PlayerBox), + mAvatarBeing(nullptr), + mShowAvatar(false) { // Basic Window Setup setWindowName("NpcText"); @@ -82,6 +87,9 @@ NpcDialog::NpcDialog(int npcId) : setDefaultSize(400, 400, ImageRect::CENTER); + mPlayerBox->setWidth(70); + mPlayerBox->setHeight(100); + mItemLinkHandler = new ItemLinkHandler; // Setup output text box mTextBox = new BrowserBox(BrowserBox::AUTO_WRAP); @@ -155,6 +163,12 @@ NpcDialog::~NpcDialog() clearLayout(); + if (mPlayerBox) + { + delete mPlayerBox->getBeing(); + delete mPlayerBox; + } + delete mTextBox; mTextBox = nullptr; delete mClearButton; @@ -469,6 +483,88 @@ void NpcDialog::closeAll() } } +void NpcDialog::placeNormalControls() +{ + if (mShowAvatar) + { + place(0, 0, mPlayerBox); + place(1, 0, mScrollArea, 5, 3); + place(4, 3, mClearButton); + place(5, 3, mButton); + } + else + { + place(0, 0, mScrollArea, 5, 3); + place(3, 3, mClearButton); + place(4, 3, mButton); + } +} + +void NpcDialog::placeMenuControls() +{ + if (mShowAvatar) + { + place(0, 0, mPlayerBox); + place(1, 0, mScrollArea, 6, 3); + place(0, 3, mListScrollArea, 7, 3); + place(3, 6, mClearButton, 2); + place(5, 6, mButton, 2); + } + else + { + place(0, 0, mScrollArea, 6, 3); + place(0, 3, mListScrollArea, 6, 3); + place(2, 6, mClearButton, 2); + place(4, 6, mButton, 2); + } +} + +void NpcDialog::placeTextInputControls() +{ + if (mShowAvatar) + { + place(0, 0, mPlayerBox); + place(1, 0, mScrollArea, 6, 3); + place(0, 3, mTextField, 6); + place(0, 4, mResetButton, 2); + place(4, 4, mClearButton, 2); + place(5, 4, mButton, 2); + } + else + { + place(0, 0, mScrollArea, 6, 3); + place(0, 3, mTextField, 6); + place(0, 4, mResetButton, 2); + place(2, 4, mClearButton, 2); + place(4, 4, mButton, 2); + } +} + +void NpcDialog::placeIntInputControls() +{ + if (mShowAvatar) + { + place(0, 0, mPlayerBox); + place(1, 0, mScrollArea, 6, 3); + place(1, 3, mMinusButton, 1); + place(2, 3, mIntField, 4); + place(6, 3, mPlusButton, 1); + place(0, 4, mResetButton, 2); + place(3, 4, mClearButton, 2); + place(5, 4, mButton, 2); + } + else + { + place(0, 0, mScrollArea, 6, 3); + place(0, 3, mMinusButton, 1); + place(1, 3, mIntField, 4); + place(5, 3, mPlusButton, 1); + place(0, 4, mResetButton, 2); + place(2, 4, mClearButton, 2); + place(4, 4, mButton, 2); + } +} + void NpcDialog::buildLayout() { clearLayout(); @@ -481,47 +577,28 @@ void NpcDialog::buildLayout() mButton->setCaption(CAPTION_NEXT); else if (mActionState == NPC_ACTION_CLOSE) mButton->setCaption(CAPTION_CLOSE); - place(0, 0, mScrollArea, 5, 3); - place(3, 3, mClearButton); - place(4, 3, mButton); + placeNormalControls(); } else if (mInputState != NPC_INPUT_NONE) { -// if (!mLogInteraction) -// setText(mNewText); - mButton->setCaption(CAPTION_SUBMIT); if (mInputState == NPC_INPUT_LIST) { - place(0, 0, mScrollArea, 6, 3); - place(0, 3, mListScrollArea, 6, 3); - place(2, 6, mClearButton, 2); - place(4, 6, mButton, 2); - + placeMenuControls(); mItemList->setSelected(-1); } else if (mInputState == NPC_INPUT_STRING) { - place(0, 0, mScrollArea, 6, 3); - place(0, 3, mTextField, 6); - place(0, 4, mResetButton, 2); - place(2, 4, mClearButton, 2); - place(4, 4, mButton, 2); + placeTextInputControls(); } else if (mInputState == NPC_INPUT_INTEGER) { - place(0, 0, mScrollArea, 6, 3); - place(0, 3, mMinusButton, 1); - place(1, 3, mIntField, 4); - place(5, 3, mPlusButton, 1); - place(0, 4, mResetButton, 2); - place(2, 4, mClearButton, 2); - place(4, 4, mButton, 2); + placeIntInputControls(); } } Layout &layout = getLayout(); - layout.setRowHeight(0, Layout::AUTO_SET); + layout.setRowHeight(1, Layout::AUTO_SET); redraw(); @@ -557,3 +634,74 @@ void NpcDialog::restoreCamera() } mCameraMode = -1; } + +void NpcDialog::showAvatar(int avatarId) +{ + bool needShow = (avatarId != 0); + if (needShow) + { + delete mAvatarBeing; + mAvatarBeing = new Being(0, ActorSprite::NPC, avatarId, nullptr); + mPlayerBox->setPlayer(mAvatarBeing); + if (mAvatarBeing && !mAvatarBeing->empty()) + { + mAvatarBeing->logic(); + Sprite *sprite = mAvatarBeing->getSprite(0); + if (sprite) + { + int width = sprite->getWidth() + 2 * getPadding(); + mPlayerBox->setWidth(width); + int height = sprite->getHeight() + 2 * getPadding(); + mPlayerBox->setHeight(height); + } + } + } + else + { + delete mAvatarBeing; + mAvatarBeing = nullptr; + mPlayerBox->setPlayer(nullptr); + } + if (needShow != mShowAvatar) + { + mShowAvatar = needShow; + buildLayout(); + } + else + { + mShowAvatar = needShow; + } +} + +void NpcDialog::setAvatarDirection(uint8_t direction) +{ + Being *being = mPlayerBox->getBeing(); + if (being) + being->setDirection(direction); +} + +void NpcDialog::setAvatarAction(int actionId) +{ + Being *being = mPlayerBox->getBeing(); + if (being) + being->setAction((Being::Action)actionId); +} + +void NpcDialog::logic() +{ + Window::logic(); + if (mShowAvatar && mAvatarBeing) + { + mAvatarBeing->logic(); + if (mPlayerBox->getWidth() < (signed)(3 * getPadding())) + { + Sprite *sprite = mAvatarBeing->getSprite(0); + if (sprite) + { + mPlayerBox->setWidth(sprite->getWidth() + 2 * getPadding()); + mPlayerBox->setHeight(sprite->getHeight() + 2 * getPadding()); + buildLayout(); + } + } + } +} diff --git a/src/gui/npcdialog.h b/src/gui/npcdialog.h index f56af664e..68ee17e33 100644 --- a/src/gui/npcdialog.h +++ b/src/gui/npcdialog.h @@ -34,10 +34,12 @@ #include <list> +class Being; class BrowserBox; class ItemLinkHandler; class IntTextField; class ListBox; +class PlayerBox; class TextBox; class TextField; class Button; @@ -184,12 +186,28 @@ class NpcDialog : public Window, public gcn::ActionListener, void refocus(); + void showAvatar(int avatarId); + + void setAvatarDirection(uint8_t direction); + + void setAvatarAction(int actionId); + + void logic(); + private: typedef std::list<NpcDialog*> DialogList; static DialogList instances; void buildLayout(); + void placeNormalControls(); + + void placeMenuControls(); + + void placeTextInputControls(); + + void placeIntInputControls(); + int mNpcId; bool mLogInteraction; @@ -245,6 +263,9 @@ class NpcDialog : public Window, public gcn::ActionListener, int mCameraMode; int mCameraX; int mCameraY; + PlayerBox *mPlayerBox; + Being *mAvatarBeing; + bool mShowAvatar; }; #endif // NPCDIALOG_H diff --git a/src/gui/widgets/playerbox.cpp b/src/gui/widgets/playerbox.cpp index 5e2412d3b..90a9c9409 100644 --- a/src/gui/widgets/playerbox.cpp +++ b/src/gui/widgets/playerbox.cpp @@ -40,7 +40,7 @@ int PlayerBox::instances = 0; float PlayerBox::mAlpha = 1.0; ImageRect PlayerBox::background; -PlayerBox::PlayerBox(const Being *being): +PlayerBox::PlayerBox(Being *being): mBeing(being) { setFrameSize(2); diff --git a/src/gui/widgets/playerbox.h b/src/gui/widgets/playerbox.h index d2393ca08..9e5a761b4 100644 --- a/src/gui/widgets/playerbox.h +++ b/src/gui/widgets/playerbox.h @@ -42,7 +42,7 @@ class PlayerBox : public gcn::ScrollArea * Constructor. Takes the initial player character that this box should * display, which defaults to <code>NULL</code>. */ - PlayerBox(const Being *being = nullptr); + PlayerBox(Being *being = nullptr); /** * Destructor. @@ -54,7 +54,7 @@ class PlayerBox : public gcn::ScrollArea * player to <code>NULL</code> causes the box not to draw any * character. */ - void setPlayer(const Being *being) + void setPlayer(Being *being) { mBeing = being; } /** @@ -67,8 +67,11 @@ class PlayerBox : public gcn::ScrollArea */ void drawFrame(gcn::Graphics *graphics); + Being *getBeing() + { return mBeing; } + private: - const Being *mBeing; /**< The character used for display */ + Being *mBeing; /**< The character used for display */ static float mAlpha; static int instances; |