From cb5a80c169e10adf6d6b9392bba7c9946edf087d Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sun, 5 Jun 2005 21:29:13 +0000 Subject: Implemented wrapping for textbox (still could use a small fix) and made death notice dialog release modal focus immediately. --- ChangeLog | 1 + src/game.cpp | 1 + src/gui/chat.cpp | 74 +++++----------------------------------------------- src/gui/chat.h | 11 -------- src/gui/gui.h | 1 - src/gui/npc_text.cpp | 29 +++++--------------- src/gui/textbox.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/gui/textbox.h | 5 ++++ 8 files changed, 92 insertions(+), 103 deletions(-) diff --git a/ChangeLog b/ChangeLog index 949bec62..3ef19e4c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,7 @@ - Added in-game help window - Upgraded to Guichan 0.4.0 - Dialogs are now modal when appropriate +- Maximum item icon size changed to 32x32 - Fixed a crash in OpenGL mode - Fixed rendering of minimap, progress bars and player sprite in OpenGL mode - Fixed 100% CPU usage when minimized diff --git a/src/game.cpp b/src/game.cpp index 07c98f7c..7e7cf4e3 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1089,6 +1089,7 @@ void do_parse() deathNotice = new OkDialog("Message", "You're now dead, press ok to restart", &deathNoticeListener); + deathNotice->releaseModalFocus(); player_node->action = DEAD; } break; diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index 84a12585..a0b027ae 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -41,6 +41,8 @@ ChatWindow::ChatWindow(const std::string &logfile): chatInput = new ChatInput(); textOutput->setEditable(false); scrollArea = new ScrollArea(textOutput); + scrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); + scrollArea->setVerticalScrollPolicy(gcn::ScrollArea::SHOW_ALWAYS); scrollArea->setDimension(gcn::Rectangle( 2, 0, 596, 98 - chatInput->getHeight() - 5)); scrollArea->setOpaque(false); @@ -101,42 +103,10 @@ void ChatWindow::chat_log(std::string line, int own) line = tmp.nick + line; - // A try to get text sentences no too long... - bool finished = false; - unsigned int maxLength = 97; - - while (!finished) - { - std::string tempText = line; - - if (line.length() > maxLength) - { - if (line.length() > maxLength) { - line = cutString(tempText, maxLength); - } - - //tmp.text = tempText; - - //chatlog_file << tmp.nick << tmp.text << "\n"; - //chatlog_file.flush(); - - //chatlog.push_front(tmp); - } - else // Normal message - { - //tmp.text = line; - //chatlog_file << tmp.nick << tmp.text << "\n"; - //chatlog_file.flush(); - - //chatlog.push_front(tmp); - finished = true; - } - - textOutput->setText( - textOutput->getText() + std::string("\n") + tempText); - scrollArea->setVerticalScrollAmount( - scrollArea->getVerticalMaxScroll()); - } + textOutput->setText( + textOutput->getText() + std::string("\n") + line); + scrollArea->setVerticalScrollAmount( + scrollArea->getVerticalMaxScroll()); } void ChatWindow::chat_log(CHATSKILL action) @@ -356,38 +326,6 @@ std::string ChatWindow::const_msg(CHATSKILL action) return msg; } -std::string ChatWindow::cutString(std::string& value, unsigned int maximumLength) -{ - // If the string exceeds the maximum length - if (value.length() > maximumLength) - { - unsigned int index = 0; - unsigned int lastSpace = 0; - std::string cutOff = ""; - - for (index = 0; index < maximumLength; index++) { - if (value.at(index) == ' ') { - lastSpace = index; - } - } - - // If the last space is at the beginning of the string - if (lastSpace == 0) { - // Just cut it right off from the end - cutOff = value.substr(maximumLength); - value = value.substr(0, maximumLength); - } else { - // Cut it off from the last space forward - cutOff = value.substr(lastSpace + 1); - value = value.substr(0, lastSpace); - } - - return cutOff; - } - - return std::string(""); -} - void ChatWindow::keyPress(const gcn::Key &key) { if (key.getValue() == key.DOWN && curHist != history.end()) diff --git a/src/gui/chat.h b/src/gui/chat.h index f242e3ee..28955ecf 100644 --- a/src/gui/chat.h +++ b/src/gui/chat.h @@ -196,17 +196,6 @@ class ChatWindow : public Window, public gcn::ActionListener, /** Constructs failed messages for actions */ std::string const_msg(CHATSKILL); - /** - * Cuts a string into two on a per word basis. - * - * @param value The string to be cut, it may be modified - * in the function. - * @param maximumLength The length after which the string - * should be cut. - * @return The cut off section of the string - */ - std::string cutString(std::string& value, unsigned int maximumLength); - gcn::TextField *chatInput; /**< Input box for typing chat messages */ gcn::TextBox *textOutput; /**< Text box for displaying chat history */ ScrollArea *scrollArea; /**< Scroll area around text output */ diff --git a/src/gui/gui.h b/src/gui/gui.h index 057753d4..1c8ccb34 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -77,7 +77,6 @@ class Gui : public gcn::Gui, public gcn::MouseListener #endif gcn::ImageLoader *imageLoader; /**< For loading images */ gcn::ImageFont *guiFont; /**< The global GUI font */ - gcn::FocusHandler *focusHandler; /**< The focus handler */ }; extern Gui *gui; /**< The GUI system */ diff --git a/src/gui/npc_text.cpp b/src/gui/npc_text.cpp index b6bd962f..7fc59343 100644 --- a/src/gui/npc_text.cpp +++ b/src/gui/npc_text.cpp @@ -37,6 +37,8 @@ NpcTextDialog::NpcTextDialog(): okButton = new Button("OK"); setContentSize(260, 175); + scrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); + scrollArea->setVerticalScrollPolicy(gcn::ScrollArea::SHOW_ALWAYS); scrollArea->setDimension(gcn::Rectangle( 5, 5, 250, 160 - okButton->getHeight())); okButton->setPosition( @@ -61,32 +63,13 @@ NpcTextDialog::~NpcTextDialog() void NpcTextDialog::setText(const char *text) { - std::string tmp = ""; - int lineWidth = 0; - int w = scrollArea->getWidth(); - for (unsigned int i = 0; i < strlen(text); i++) - { - if (text[i] != '\n') - { - std::string tmpChar = ""; tmpChar += text[i]; - lineWidth += getFont()->getWidth(tmpChar); - if (lineWidth > w) { - tmp += '\n'; - lineWidth = 0; - } - } else - { - lineWidth = 0; - } - tmp += text[i]; - } - textBox->setText(tmp); + textBox->setText(text); } void NpcTextDialog::addText(const char *text) { - std::string tmp = textBox->getText() + std::string(text) + std::string("\n"); - setText(tmp.c_str()); + textBox->setText( + textBox->getText() + std::string(text) + std::string("\n")); } void NpcTextDialog::action(const std::string& eventId) @@ -96,5 +79,5 @@ void NpcTextDialog::action(const std::string& eventId) WFIFOSET(6); setText(""); setVisible(false); - current_npc = 0; + current_npc = 0; } diff --git a/src/gui/textbox.cpp b/src/gui/textbox.cpp index a620f29f..06ee3598 100644 --- a/src/gui/textbox.cpp +++ b/src/gui/textbox.cpp @@ -22,6 +22,7 @@ */ #include "textbox.h" +#include TextBox::TextBox(): gcn::TextBox() @@ -36,3 +37,75 @@ TextBox::TextBox(const std::string& text): setOpaque(false); setBorderSize(0); } + +void TextBox::setText(const std::string &text) +{ + // Make sure parent scroll area sets width of this widget + if (getParent()) + { + getParent()->logic(); + } + + std::stringstream wrappedStream; + std::string::size_type newlinePos, lastNewlinePos = 0; + + do + { + // Determine next piece of string to wrap + newlinePos = text.find("\n", lastNewlinePos); + + if (newlinePos == std::string::npos) + { + newlinePos = text.size(); + } + + std::string line = + text.substr(lastNewlinePos, newlinePos - lastNewlinePos); + std::string::size_type spacePos, lastSpacePos = 0; + int xpos = 0; + + do + { + spacePos = line.find(" ", lastSpacePos); + + if (spacePos == std::string::npos) + { + spacePos = line.size(); + } + + std::string word = + line.substr(lastSpacePos, spacePos - lastSpacePos); + + int width = getFont()->getWidth(word); + + if (xpos != 0 && xpos + width < getWidth()) + { + xpos += width + getFont()->getWidth(" "); + wrappedStream << " " << word; + } + else if (lastSpacePos == 0) + { + xpos += width; + wrappedStream << word; + } + else + { + xpos = width; + wrappedStream << "\n" << word; + } + + lastSpacePos = spacePos + 1; + } + while (spacePos != line.size()); + + if (text.find("\n", lastNewlinePos) != std::string::npos) + { + wrappedStream << "\n"; + } + + lastNewlinePos = newlinePos + 1; + } + while (newlinePos != text.size()); + + gcn::TextBox::setText(wrappedStream.str()); +} diff --git a/src/gui/textbox.h b/src/gui/textbox.h index 8f5d910f..5c315d15 100644 --- a/src/gui/textbox.h +++ b/src/gui/textbox.h @@ -44,6 +44,11 @@ class TextBox : public gcn::TextBox { * Constructor. */ TextBox(const std::string& text); + + /** + * Sets the text after wrapping it to the current width of the widget. + */ + void setText(const std::string &text); }; #endif -- cgit v1.2.3-60-g2f50