summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-11-23 19:34:09 +0300
committerAndrei Karas <akaras@inbox.ru>2015-11-23 21:07:37 +0300
commit4d21db4402e790bea01b083302547c8df8975596 (patch)
tree6a1b8632b21fd9d85a9769eff6f6d34752146170
parent4ea8f4bb0c2645940d7d0f5b5e6990346d474ce4 (diff)
downloadmv-4d21db4402e790bea01b083302547c8df8975596.tar.gz
mv-4d21db4402e790bea01b083302547c8df8975596.tar.bz2
mv-4d21db4402e790bea01b083302547c8df8975596.tar.xz
mv-4d21db4402e790bea01b083302547c8df8975596.zip
Add text select dialog.
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/gui/windows/textselectdialog.cpp178
-rw-r--r--src/gui/windows/textselectdialog.h105
4 files changed, 287 insertions, 0 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index fa5fcf071..ba6940cba 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -496,6 +496,8 @@ SET(SRCS
gui/windows/statuswindow.h
gui/windows/textdialog.cpp
gui/windows/textdialog.h
+ gui/windows/textselectdialog.cpp
+ gui/windows/textselectdialog.h
gui/popups/textpopup.cpp
gui/popups/textpopup.h
gui/skin.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 061b38cdb..dc261d333 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -948,6 +948,8 @@ manaplus_SOURCES += main.cpp \
gui/windows/statuswindow.h \
gui/windows/textdialog.cpp \
gui/windows/textdialog.h \
+ gui/windows/textselectdialog.cpp \
+ gui/windows/textselectdialog.h \
gui/windows/setupwindow.cpp \
gui/windows/setupwindow.h \
gui/windows/serverdialog.cpp \
diff --git a/src/gui/windows/textselectdialog.cpp b/src/gui/windows/textselectdialog.cpp
new file mode 100644
index 000000000..7f6de8617
--- /dev/null
+++ b/src/gui/windows/textselectdialog.cpp
@@ -0,0 +1,178 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 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/windows/textselectdialog.h"
+
+#include "gui/windows/setupwindow.h"
+
+#include "gui/models/namesmodel.h"
+
+#include "gui/widgets/button.h"
+#include "gui/widgets/containerplacer.h"
+#include "gui/widgets/createwidget.h"
+#include "gui/widgets/label.h"
+#include "gui/widgets/layout.h"
+#include "gui/widgets/layouttype.h"
+#include "gui/widgets/listbox.h"
+#include "gui/widgets/scrollarea.h"
+
+#include "utils/delete2.h"
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
+
+#include "debug.h"
+
+TextSelectDialog::TextSelectDialog(const std::string &name,
+ const std::string &selectButton) :
+ // TRANSLATORS: sell dialog name
+ Window(name, Modal_false, nullptr, "sell.xml"),
+ ActionListener(),
+ SelectionListener(),
+ mSelectButtonName(selectButton),
+ mText(),
+ mSelectButton(nullptr),
+ mQuitButton(nullptr),
+ mItemList(nullptr),
+ mScrollArea(nullptr),
+ mModel(nullptr)
+{
+}
+
+void TextSelectDialog::postInit()
+{
+ setWindowName("TextSelectDialog");
+ setResizable(true);
+ setCloseButton(true);
+ setStickyButtonLock(true);
+ setMinWidth(260);
+ setMinHeight(220);
+ setDefaultSize(260, 230, ImageRect::CENTER);
+
+ if (setupWindow)
+ setupWindow->registerWindowForReset(this);
+
+ setActionEventId("OK");
+ mModel = new NamesModel;
+ mItemList = CREATEWIDGETR(ListBox,
+ this,
+ mModel,
+ "listbox.xml");
+ mScrollArea = new ScrollArea(this, mItemList,
+ getOptionBool("showbackground"), "sell_background.xml");
+ mScrollArea->setHorizontalScrollPolicy(ScrollArea::SHOW_NEVER);
+
+ mSelectButton = new Button(this,
+ mSelectButtonName,
+ "select",
+ this);
+ // TRANSLATORS: sell dialog button
+ mQuitButton = new Button(this, _("Quit"), "quit", this);
+
+ mSelectButton->setEnabled(false);
+
+ mItemList->setDistributeMousePressed(false);
+ mItemList->addSelectionListener(this);
+ mItemList->setActionEventId("item");
+ mItemList->addActionListener(this);
+
+ ContainerPlacer placer;
+ placer = getPlacer(0, 0);
+
+ placer(0, 0, mScrollArea, 8, 5).setPadding(3);
+ placer(6, 5, mSelectButton);
+ placer(7, 5, mQuitButton);
+
+ Layout &layout = getLayout();
+ layout.setRowHeight(0, LayoutType::SET);
+
+ center();
+ loadWindowState();
+
+ setVisible(Visible_true);
+ enableVisibleSound(true);
+}
+
+TextSelectDialog::~TextSelectDialog()
+{
+ delete2(mModel);
+}
+
+void TextSelectDialog::action(const ActionEvent &event)
+{
+ const std::string &eventId = event.getId();
+
+ if (eventId == "quit")
+ {
+ close();
+ return;
+ }
+
+ const int selectedItem = mItemList->getSelected();
+
+ // The following actions require a valid item selection
+ if (selectedItem == -1 ||
+ selectedItem >= mModel->getNumberOfElements())
+ {
+ return;
+ }
+ else if (eventId == "select")
+ {
+ const int index = mItemList->getSelected();
+ if (index < 0 || index >= static_cast<int>(mModel->size()))
+ return;
+ mText = mModel->getElementAt(index);
+ distributeActionEvent();
+ close();
+ }
+}
+
+void TextSelectDialog::updateButtonsAndLabels()
+{
+ mSelectButton->setEnabled(mItemList->getSelected() > -1);
+}
+
+void TextSelectDialog::valueChanged(const SelectionEvent &event A_UNUSED)
+{
+ updateButtonsAndLabels();
+}
+
+void TextSelectDialog::setVisible(Visible visible)
+{
+ Window::setVisible(visible);
+
+ if (visible == Visible_true)
+ {
+ if (mItemList)
+ mItemList->requestFocus();
+ }
+ else
+ {
+ scheduleDelete();
+ }
+}
+
+void TextSelectDialog::addText(const std::string &text)
+{
+ if (text.empty())
+ return;
+ mModel->add(text);
+}
diff --git a/src/gui/windows/textselectdialog.h b/src/gui/windows/textselectdialog.h
new file mode 100644
index 000000000..86a834d2e
--- /dev/null
+++ b/src/gui/windows/textselectdialog.h
@@ -0,0 +1,105 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 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_WIDGETS_TEXTSELECTDIALOG_H
+#define GUI_WIDGETS_TEXTSELECTDIALOG_H
+
+#include "enums/simpletypes/itemcolor.h"
+
+#include "gui/widgets/window.h"
+
+#include "listeners/actionlistener.h"
+#include "listeners/selectionlistener.h"
+
+class Button;
+class Item;
+class Label;
+class ScrollArea;
+class ShopItem;
+class NamesModel;
+class ListBox;
+
+class TextSelectDialog notfinal : public Window,
+ public ActionListener,
+ private SelectionListener
+{
+ public:
+ /**
+ * Constructor.
+ */
+ TextSelectDialog(const std::string &name,
+ const std::string &selectButton);
+
+ A_DELETE_COPY(TextSelectDialog)
+
+ /**
+ * Destructor
+ */
+ ~TextSelectDialog();
+
+ /**
+ * Called when receiving actions from the widgets.
+ */
+ void action(const ActionEvent &event) override final;
+
+ /**
+ * Updates labels according to selected item.
+ *
+ * @see SelectionListener::selectionChanged
+ */
+ void valueChanged(const SelectionEvent &event) override final;
+
+ /**
+ * Sets the visibility of this window.
+ */
+ void setVisible(Visible visible) override final;
+
+ void postInit() override;
+
+ void addText(const std::string &text);
+
+ std::string getText() const A_WARN_UNUSED
+ { return mText; }
+
+ void setTag(const int tag)
+ { mTag = tag; }
+
+ int getTag() const A_WARN_UNUSED
+ { return mTag; }
+
+ protected:
+ /**
+ * Updates the state of buttons and labels.
+ */
+ void updateButtonsAndLabels();
+
+ std::string mSelectButtonName;
+ std::string mText;
+ Button *mSelectButton A_NONNULLPOINTER;
+ Button *mQuitButton A_NONNULLPOINTER;
+ ListBox *mItemList A_NONNULLPOINTER;
+ ScrollArea *mScrollArea A_NONNULLPOINTER;
+ NamesModel *mModel A_NONNULLPOINTER;
+ int mTag;
+};
+
+#endif // GUI_WIDGETS_TEXTSELECTDIALOG_H