From: Ondrej H. <tan...@us...> - 2003-12-25 23:20:56
|
Update of /cvsroot/planeshift/planeshift/src/common/paws In directory sc8-pr-cvs1:/tmp/cvs-serv15090 Added Files: pawspromptwindow.cpp pawspromptwindow.h pawsnumberpromptwindow.cpp pawsnumberpromptwindow.h pawsstringpromptwindow.cpp pawsstringpromptwindow.h pawscombopromptwindow.cpp pawscombopromptwindow.h Log Message: Added first version of simple prompt windows that let the user enter string, number or choose something from combobox --- NEW FILE: pawspromptwindow.cpp --- /* * pawspromptwindow.cpp - Author: Ondrej Hurt * * Copyright (C) 2003 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * 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 (version 2 of the License) * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ // CS INCLUDES #include <config.h> // COMMON INCLUDES #include "util/log.h" // PAWS INCLUDES #include "pawspromptwindow.h" #include "pawsmanager.h" #include "pawsbutton.h" #include "pawstextbox.h" #define SPACING 10 //distance between inner widgets and border pawsPromptWindow::pawsPromptWindow(PawsManager* manager) : pawsWidget(manager) { label = NULL; okButton = NULL; cancelButton = NULL; inputWidget = NULL; } bool pawsPromptWindow::PostSetup() { SetBackground("Standard Background"); UseBorder("line"); label = new pawsTextBox(windowManager); AddChild(label); okButton = new pawsButton(windowManager); AddChild(okButton); okButton->SetUpImage("Blue Title"); okButton->SetSize(60, 20); okButton->SetText(windowManager->Translate("OK")); cancelButton = new pawsButton(windowManager); AddChild(cancelButton); cancelButton->SetUpImage("Blue Title"); cancelButton->SetSize(60, 20); cancelButton->SetText(windowManager->Translate("cancel")); } void pawsPromptWindow::SetLabel(const csString & label) { this->label->SetText(label); this->label->SetSizeByText(); LayoutWindow(); } void pawsPromptWindow::LayoutWindow() { int windowWidth, windowHeight; assert(label && okButton && cancelButton && inputWidget); windowWidth = MAX( 2*SPACING + label->ScreenFrame().Width(), MAX( 2*SPACING + inputWidget->ScreenFrame().Width(), 3*SPACING + okButton->ScreenFrame().Width() + cancelButton->ScreenFrame().Width() ) ); windowHeight = 4*SPACING + label->ScreenFrame().Height() + inputWidget->ScreenFrame().Height() + okButton->ScreenFrame().Height(); SetSize(windowWidth, windowHeight); label->MoveTo(screenFrame.xmin + (windowWidth-label->ScreenFrame().Width()) / 2, screenFrame.ymin + SPACING); inputWidget->MoveTo(screenFrame.xmin + (windowWidth-inputWidget->ScreenFrame().Width()) / 2, screenFrame.ymin + 2*SPACING + label->ScreenFrame().Height()); okButton->MoveTo(screenFrame.xmin + (windowWidth-okButton->ScreenFrame().Width()-cancelButton->ScreenFrame().Width()-SPACING) / 2, screenFrame.ymin + 3*SPACING + label->ScreenFrame().Height() + inputWidget->ScreenFrame().Height()); cancelButton->MoveTo(okButton->ScreenFrame().xmin + okButton->ScreenFrame().Width() + SPACING, okButton->ScreenFrame().ymin); } void pawsPromptWindow::SetAppropriatePos() { csPoint mouse; int x, y; int width, height; width = screenFrame.Width(); height = screenFrame.Height(); mouse = windowManager->GetMouse()->GetPosition(); x = mouse.x - width / 2; y = mouse.y - height / 2; MoveTo(x, y); MakeFullyVisible(); } --- NEW FILE: pawspromptwindow.h --- /* * pawspromptwindow.h - Author: Ondrej Hurt * * Copyright (C) 2003 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * 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 (version 2 of the License) * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef PAWS_PROMPT_WINDOW_HEADER #define PAWS_PROMPT_WINDOW_HEADER #include <csutil/list.h> #include <iutil/document.h> #include "pawswidget.h" class pawsButton; class pawsTextBox; /** * pawsPromptWindow is common base for windows that let the user enter one piece of information. * It has label telling th euser what is expected, OK and Cancel buttons and *some* widget * that is used to enter the information. Different widgets are used for different kinds of input. */ class pawsPromptWindow : public pawsWidget { public: pawsPromptWindow(PawsManager* manager); //from pawsWidget: virtual bool PostSetup(); void SetLabel(const csString & label); protected: /** Sets good position on screen (=under mouse cursor) */ void SetAppropriatePos(); /** Sets positions of widgets and size of whole window */ void LayoutWindow(); pawsTextBox * label; pawsButton * okButton, * cancelButton; pawsWidget * inputWidget; }; CREATE_PAWS_FACTORY(pawsPromptWindow) #endif --- NEW FILE: pawsnumberpromptwindow.cpp --- /* * pawsnumberpromptwindow.cpp - Author: Ondrej Hurt * * Copyright (C) 2003 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * 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 (version 2 of the License) * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ // CS INCLUDES #include <config.h> // COMMON INCLUDES #include "util/log.h" // PAWS INCLUDES #include "pawsnumberpromptwindow.h" #include "pawstextbox.h" #include "pawsbutton.h" #include "pawscrollbar.h" #include "pawsmanager.h" class pawsNumberInput : public pawsWidget { public: pawsNumberInput(PawsManager* windowManager) : pawsWidget(windowManager) { SetSize(110, 50); editBox = new pawsEditTextBox(windowManager); AddChild(editBox); editBox->MoveTo(screenFrame.xmin+20, screenFrame.ymin); editBox->SetSize(70, 20); editBox->UseBorder("line"); scrollBar = new pawsScrollBar(windowManager); AddChild(scrollBar); scrollBar->SetRelativeFrame(0, 30, 110, 20); scrollBar->SetHorizontal(true); scrollBar->SetTickValue(1); scrollBar->PostSetup(); scrollBar->UseBorder("line"); } pawsEditTextBox * editBox; pawsScrollBar * scrollBar; }; pawsNumberPromptWindow::pawsNumberPromptWindow(PawsManager* manager) : pawsPromptWindow(manager) { editBox = NULL; scrollBar = NULL; action = NULL; SetMaxNumber(0); lastValidText = ""; } bool pawsNumberPromptWindow::PostSetup() { pawsPromptWindow::PostSetup(); pawsNumberInput * numberInput = new pawsNumberInput(windowManager); AddChild(numberInput); inputWidget = numberInput; editBox = numberInput->editBox; scrollBar = numberInput->scrollBar; LayoutWindow(); } bool pawsNumberPromptWindow::OnButtonPressed( int mouseButton, int keyModifier, pawsWidget* widget ) { if (action == NULL) return false; if (widget == okButton) { if (TextIsValidForOutput(editBox->GetText())) NumberWasEntered(atoi(editBox->GetText())); return true; } else if (widget == cancelButton) { if (action != NULL) { action->Execute(-1); delete action; action = NULL; } parent->DeleteChild(this); // windowManager->SetModalWidget(NULL); return true; } return false; } void pawsNumberPromptWindow::SetMaxNumber(int maxNumber) { csString numberStr; int div; this->maxNumber = maxNumber; if (scrollBar != NULL) scrollBar->SetMaxValue(maxNumber); if (label != NULL) { numberStr = maxNumber; label->SetText("max = "+numberStr); } maxDigits = 0; div = maxNumber; while (div > 0) { maxDigits++; div /= 10; } } bool pawsNumberPromptWindow::OnScroll( int scrollDirection, pawsScrollBar* widget ) { lastValidText = scrollBar->GetCurrentValue(); editBox->SetText(lastValidText); return true; } bool pawsNumberPromptWindow::TextIsValidForEditing(const csString & text) { if (text.Length() > maxDigits) return false; for (int i=0; i < text.Length(); i++) if ((text.GetAt(i) < '0') || (text.GetAt(i) > '9')) return false; if ( (text.GetData() != NULL) && (atoi(text.GetData()) > maxNumber) ) return false; return true; } bool pawsNumberPromptWindow::TextIsValidForOutput(const csString & text) { if (text.Length() == 0) return false; int number = atoi(text.GetData()); return TextIsValidForEditing(text) && (number > 0) && (number >= minNumber); } bool pawsNumberPromptWindow::OnChange(pawsWidget * widget) { csString text; if (widget == editBox) { text = editBox->GetText(); if (TextIsValidForEditing(text)) { lastValidText = text; if (TextIsValidForOutput(text) && (text.Length() == maxDigits)) NumberWasEntered(atoi(text.GetData())); } else editBox->SetText(lastValidText); } return true; } void pawsNumberPromptWindow::NumberWasEntered(int number) { windowManager->SetModalWidget(NULL); Hide(); if (action != NULL) { action->Execute(number); delete action; action = NULL; parent->DeleteChild(this); } } void pawsNumberPromptWindow::Initialize(int minNumber, int maxNumber) { windowManager->SetCurrentFocusedWidget(editBox); this->minNumber = minNumber; SetMaxNumber(maxNumber); SetAppropriatePos(); } --- NEW FILE: pawsnumberpromptwindow.h --- /* * pawsnumberpromptwindow.h - Author: Ondrej Hurt * * Copyright (C) 2003 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * 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 (version 2 of the License) * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef PAWS_NUMBER_PROMPT_WINDOW_HEADER #define PAWS_NUMBER_PROMPT_WINDOW_HEADER #include <csutil/list.h> #include <iutil/document.h> #include "pawspromptwindow.h" class pawsButton; class pawsEditTextBox; class pawsScrollbar; class iOnNumberEnteredAction { public: virtual void Execute(int number) = 0; // can be -1 }; /** * pawsNumberPromptWindow is window that lets the user enter a number */ class pawsNumberPromptWindow : public pawsPromptWindow { public: pawsNumberPromptWindow(PawsManager* manager); //from pawsWidget: virtual bool PostSetup(); bool OnButtonPressed( int mouseButton, int keyModifier, pawsWidget* widget ); virtual bool OnScroll( int scrollDirection, pawsScrollBar* widget ); virtual bool OnChange(pawsWidget * widget); void Initialize(int minNumber, int maxNumber); /** Sets callback to be called when user finishes input */ void SetAction(iOnNumberEnteredAction * action) { this->action = action; } protected: void SetMaxNumber(int number); /** Will we allow user to enter 'text' during editation ? */ bool TextIsValidForEditing(const csString & text); /** Will we allow user to return 'text' as the final result ? The difference is that TextIsValidForOutput() won't allow zero and empty string */ bool TextIsValidForOutput(const csString & text); /** This is called when the user enters final count (which is valid) */ void NumberWasEntered(int count); int maxNumber, minNumber; int maxDigits; /** This is last valid input from user - we use it to fall back from invalid input */ csString lastValidText; pawsEditTextBox * editBox; pawsScrollBar * scrollBar; iOnNumberEnteredAction * action; }; CREATE_PAWS_FACTORY(pawsNumberPromptWindow) #endif --- NEW FILE: pawsstringpromptwindow.cpp --- /* * pawsstringpromptwindow.cpp - Author: Ondrej Hurt * * Copyright (C) 2003 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * 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 (version 2 of the License) * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ // CS INCLUDES #include <config.h> // COMMON INCLUDES #include "util/log.h" // PAWS INCLUDES #include "pawsstringpromptwindow.h" #include "pawstextbox.h" #include "pawsbutton.h" pawsStringPromptWindow::pawsStringPromptWindow(PawsManager* manager) : pawsPromptWindow(manager) { action = NULL; } bool pawsStringPromptWindow::PostSetup() { pawsPromptWindow::PostSetup(); inputWidget = new pawsEditTextBox(windowManager); AddChild(inputWidget); inputWidget->UseBorder("line"); } void pawsStringPromptWindow::Initialize(const csString & string, bool multiline, int width, int height) { if (inputWidget!=NULL) { pawsEditTextBox * editBox = dynamic_cast<pawsEditTextBox*> (inputWidget); editBox -> SetText(string); editBox -> SetMultiline(multiline); editBox -> SetSize(width, height); } LayoutWindow(); } bool pawsStringPromptWindow::OnButtonPressed( int mouseButton, int keyModifier, pawsWidget* widget ) { if (action==NULL) return false; if (widget == okButton) { if (inputWidget!=NULL) { action->Execute(dynamic_cast<pawsEditTextBox*> (inputWidget) -> GetText()); delete action; action = NULL; parent->DeleteChild(this); } return true; } else if (widget == cancelButton) { action->Execute((const char*)NULL); delete action; action = NULL; parent->DeleteChild(this); return true; } return false; } --- NEW FILE: pawsstringpromptwindow.h --- /* * pawsstringpromptwindow.h - Author: Ondrej Hurt * * Copyright (C) 2003 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * 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 (version 2 of the License) * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef PAWS_STRING_PROMPT_WINDOW_HEADER #define PAWS_STRING_PROMPT_WINDOW_HEADER #include <csutil/list.h> #include <iutil/document.h> #include "pawspromptwindow.h" class pawsButton; class iOnStringEnteredAction { public: virtual void Execute(const csString & string) = 0; // can be -1 }; /** * pawsStringPromptWindow is window that lets the user enter string. */ class pawsStringPromptWindow : public pawsPromptWindow { public: pawsStringPromptWindow(PawsManager* manager); //from pawsWidget: virtual bool PostSetup(); bool OnButtonPressed( int mouseButton, int keyModifier, pawsWidget* widget ); void Initialize(const csString & string, bool multiline, int width, int height); /** Sets callback to be called when user finishes input */ void SetAction(iOnStringEnteredAction * action) { this->action = action; } protected: iOnStringEnteredAction * action; }; CREATE_PAWS_FACTORY(pawsStringPromptWindow) #endif --- NEW FILE: pawscombopromptwindow.cpp --- /* * pawscombopromptwindow.cpp - Author: Ondrej Hurt * * Copyright (C) 2003 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * 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 (version 2 of the License) * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ // CS INCLUDES #include <config.h> // COMMON INCLUDES #include "util/log.h" // PAWS INCLUDES #include "pawscombopromptwindow.h" #include "pawscombo.h" #include "pawsbutton.h" pawsComboPromptWindow::pawsComboPromptWindow(PawsManager* manager) : pawsPromptWindow(manager) { action = NULL; } bool pawsComboPromptWindow::PostSetup() { pawsPromptWindow::PostSetup(); inputWidget = new pawsComboBox(windowManager); AddChild(inputWidget); inputWidget->UseBorder("line"); LayoutWindow(); } void pawsComboPromptWindow::AddItem(const csString & text) { // ColumnDef col; pawsComboBox * combo; pawsListBoxRow * newOption; combo = dynamic_cast <pawsComboBox*> (inputWidget); if (combo == NULL) return; // col. newOption = combo->NewOption(); //??? } bool pawsComboPromptWindow::OnButtonPressed( int mouseButton, int keyModifier, pawsWidget* widget ) { if (action == NULL) return false; if (widget == okButton) { action->Execute(-1, ""); delete action; action = NULL; parent->DeleteChild(this); return true; } else if (widget == cancelButton) { action->Execute(-1, ""); delete action; action = NULL; parent->DeleteChild(this); return true; } return false; } --- NEW FILE: pawscombopromptwindow.h --- /* * pawscombopromptwindow.h - Author: Ondrej Hurt * * Copyright (C) 2003 PlaneShift Team (in...@pl..., * http://www.planeshift.it) * * 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 (version 2 of the License) * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef PAWS_COMBO_PROMPT_WINDOW_HEADER #define PAWS_COMBO_PROMPT_WINDOW_HEADER #include <csutil/list.h> #include <iutil/document.h> #include "pawspromptwindow.h" class pawsButton; class iOnItemChosenAction { public: virtual void Execute(int itemNum, const csString & itemText) = 0; // can be -1 }; /** * pawsComboPromptWindow is window that lets the user choose item from combo box */ class pawsComboPromptWindow : public pawsPromptWindow { public: pawsComboPromptWindow(PawsManager* manager); //from pawsWidget: virtual bool PostSetup(); bool OnButtonPressed( int mouseButton, int keyModifier, pawsWidget* widget ); void AddItem(const csString & text); /** Sets callback to be called when user finishes input */ void SetAction(iOnItemChosenAction * action) { this->action = action; } protected: iOnItemChosenAction * action; }; CREATE_PAWS_FACTORY(pawsComboPromptWindow) #endif |