void GUI::OnMousePress(unsigned short button, int mx, int my) { if (MouseOverWindow != NULL) { MakeActiveWindow(MouseOverWindow); ActiveWindow->OnMousePress(button, mx, my); } else { MakeActiveWindow(NULL); } }
TextPrompt::TextPrompt(String title, String message, String text, String placeholder, bool multiline, TextDialogueCallback * callback_): ui::Window(ui::Point(-1, -1), ui::Point(200, 65)), callback(callback_) { if(multiline) Size.X += 100; ui::Label * titleLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 18), title); titleLabel->SetTextColour(style::Colour::WarningTitle); titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(titleLabel); ui::Label * messageLabel = new ui::Label(ui::Point(4, 25), ui::Point(Size.X-8, -1), message); messageLabel->SetMultiline(true); messageLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; messageLabel->Appearance.VerticalAlign = ui::Appearance::AlignTop; AddComponent(messageLabel); Size.Y += messageLabel->Size.Y+4; textField = new ui::Textbox(ui::Point(4, messageLabel->Position.Y + messageLabel->Size.Y + 7), ui::Point(Size.X-8, 16), text, placeholder); if(multiline) { textField->SetMultiline(true); textField->Size.Y = 60; Size.Y += 45; textField->Appearance.VerticalAlign = ui::Appearance::AlignTop; } else { textField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; } textField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; AddComponent(textField); FocusComponent(textField); ui::Button * cancelButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point((Size.X/2)+1, 16), "Cancel"); cancelButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; cancelButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; cancelButton->Appearance.BorderInactive = ui::Colour(200, 200, 200); cancelButton->SetActionCallback(new CloseAction(this, ResultCancel)); AddComponent(cancelButton); SetCancelButton(cancelButton); ui::Button * okayButton = new ui::Button(ui::Point(Size.X/2, Size.Y-16), ui::Point(Size.X/2, 16), "Okay"); okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignRight; okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; okayButton->Appearance.TextInactive = style::Colour::WarningTitle; okayButton->SetActionCallback(new CloseAction(this, ResultOkay)); AddComponent(okayButton); SetOkayButton(okayButton); MakeActiveWindow(); }
PropertyWindow::PropertyWindow(PropertyTool * tool_, Simulation *sim_): ui::Window(ui::Point(-1, -1), ui::Point(200, 87)), tool(tool_), sim(sim_) { properties = Particle::GetProperties(); ui::Label * messageLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 14), "Edit property"); messageLabel->SetTextColour(style::Colour::InformationTitle); messageLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; messageLabel->Appearance.VerticalAlign = ui::Appearance::AlignTop; AddComponent(messageLabel); ui::Button * okayButton = new ui::Button(ui::Point(0, Size.Y-17), ui::Point(Size.X, 17), "OK"); okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; okayButton->Appearance.BorderInactive = ui::Colour(200, 200, 200); okayButton->SetActionCallback(new OkayAction(this)); AddComponent(okayButton); SetOkayButton(okayButton); class PropertyChanged: public ui::DropDownAction { PropertyWindow * w; public: PropertyChanged(PropertyWindow * w): w(w) { } void OptionChanged(ui::DropDown * sender, std::pair<String, int> option) override { w->FocusComponent(w->textField); } }; property = new ui::DropDown(ui::Point(8, 25), ui::Point(Size.X-16, 17)); property->SetActionCallback(new PropertyChanged(this)); AddComponent(property); for (size_t i = 0; i < properties.size(); i++) { property->AddOption(std::pair<String, int>(properties[i].Name.FromAscii(), i)); } property->SetOption(Client::Ref().GetPrefInteger("Prop.Type", 0)); textField = new ui::Textbox(ui::Point(8, 46), ui::Point(Size.X-16, 16), "", "[value]"); textField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; textField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; textField->SetText(Client::Ref().GetPrefString("Prop.Value", "")); AddComponent(textField); FocusComponent(textField); MakeActiveWindow(); }
ErrorMessage::ErrorMessage(String title, String message, ErrorMessageCallback * callback_): ui::Window(ui::Point(-1, -1), ui::Point(200, 35)), callback(callback_) { ui::Label * titleLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 16), title); titleLabel->SetTextColour(style::Colour::ErrorTitle); titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(titleLabel); ui::Label * messageLabel = new ui::Label(ui::Point(4, 24), ui::Point(Size.X-8, -1), message); messageLabel->SetMultiline(true); messageLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; messageLabel->Appearance.VerticalAlign = ui::Appearance::AlignTop; AddComponent(messageLabel); Size.Y += messageLabel->Size.Y+12; Position.Y = (ui::Engine::Ref().GetHeight()-Size.Y)/2; class DismissAction: public ui::ButtonAction { ErrorMessage * message; public: DismissAction(ErrorMessage * message_) { message = message_; } void ActionCallback(ui::Button * sender) { message->CloseActiveWindow(); if(message->callback) message->callback->DismissCallback(); message->SelfDestruct(); } }; ui::Button * okayButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point(Size.X, 16), "Dismiss"); okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; okayButton->Appearance.BorderInactive = ui::Colour(200, 200, 200); okayButton->SetActionCallback(new DismissAction(this)); AddComponent(okayButton); SetOkayButton(okayButton); SetCancelButton(okayButton); MakeActiveWindow(); }
ConfirmPrompt::ConfirmPrompt(std::string title, std::string message, ConfirmDialogueCallback * callback_): ui::Window(ui::Point(-1, -1), ui::Point(250, 35)), callback(callback_) { ui::Label * titleLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 15), title); titleLabel->SetTextColour(style::Colour::WarningTitle); titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(titleLabel); ui::ScrollPanel *messagePanel = new ui::ScrollPanel(ui::Point(4, 24), ui::Point(Size.X-8, 206)); AddComponent(messagePanel); ui::Label * messageLabel = new ui::Label(ui::Point(4, 0), ui::Point(Size.X-28, -1), message); messageLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; messageLabel->Appearance.VerticalAlign = ui::Appearance::AlignTop; messageLabel->SetMultiline(true); messagePanel->AddChild(messageLabel); messagePanel->InnerSize = ui::Point(messagePanel->Size.X, messageLabel->Size.Y+4); if (messageLabel->Size.Y < messagePanel->Size.Y) messagePanel->Size.Y = messageLabel->Size.Y+4; Size.Y += messagePanel->Size.Y+12; Position.Y = (ui::Engine::Ref().GetHeight()-Size.Y)/2; class CloseAction: public ui::ButtonAction { public: ConfirmPrompt * prompt; DialogueResult result; CloseAction(ConfirmPrompt * prompt_, DialogueResult result_) { prompt = prompt_; result = result_; } void ActionCallback(ui::Button * sender) { prompt->CloseActiveWindow(); if(prompt->callback) prompt->callback->ConfirmCallback(result); prompt->SelfDestruct(); } }; ui::Button * cancelButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point(Size.X-75, 16), "Cancel"); cancelButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; cancelButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; cancelButton->Appearance.BorderInactive = ui::Colour(200, 200, 200); cancelButton->SetActionCallback(new CloseAction(this, ResultCancel)); AddComponent(cancelButton); SetCancelButton(cancelButton); ui::Button * okayButton = new ui::Button(ui::Point(Size.X-76, Size.Y-16), ui::Point(76, 16), "Continue"); okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; okayButton->Appearance.TextInactive = style::Colour::WarningTitle; okayButton->SetActionCallback(new CloseAction(this, ResultOkay)); AddComponent(okayButton); SetOkayButton(okayButton); MakeActiveWindow(); }
SignWindow::SignWindow(SignTool * tool_, Simulation * sim_, int signID_, ui::Point position_): ui::Window(ui::Point(-1, -1), ui::Point(250, 87)), tool(tool_), movingSign(NULL), signMoving(false), sim(sim_), signID(signID_), signPosition(position_) { ui::Label * messageLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 15), "New sign"); messageLabel->SetTextColour(style::Colour::InformationTitle); messageLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; messageLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(messageLabel); ui::Button * okayButton = new ui::Button(ui::Point(0, Size.Y-16), ui::Point(Size.X, 16), "OK"); okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; okayButton->Appearance.BorderInactive = (ui::Colour(200, 200, 200)); okayButton->SetActionCallback(new OkayAction(this)); AddComponent(okayButton); SetOkayButton(okayButton); ui::Label * tempLabel = new ui::Label(ui::Point(8, 48), ui::Point(40, 15), "Pointer:"); okayButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; okayButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; AddComponent(tempLabel); justification = new ui::DropDown(ui::Point(52, 48), ui::Point(50, 16)); AddComponent(justification); justification->AddOption(std::pair<String, int>(0xE020 + String(" Left"), (int)sign::Left)); justification->AddOption(std::pair<String, int>(0xE01E + String(" Middle"), (int)sign::Middle)); justification->AddOption(std::pair<String, int>(0xE01F + String(" Right"), (int)sign::Right)); justification->AddOption(std::pair<String, int>(0xE01D + String(" None"), (int)sign::None)); justification->SetOption(1); justification->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; textField = new ui::Textbox(ui::Point(8, 25), ui::Point(Size.X-16, 17), "", "[message]"); textField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; textField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; textField->SetLimit(45); textField->SetActionCallback(new SignTextAction(this)); AddComponent(textField); FocusComponent(textField); if(signID!=-1) { messageLabel->SetText("Edit sign"); textField->SetText(sim->signs[signID].text); justification->SetOption(sim->signs[signID].ju); ui::Point position = ui::Point(justification->Position.X+justification->Size.X+3, 48); ui::Button * moveButton = new ui::Button(position, ui::Point(((Size.X-position.X-8)/2)-2, 16), "Move"); moveButton->SetActionCallback(new MoveAction(this)); AddComponent(moveButton); position = ui::Point(justification->Position.X+justification->Size.X+3, 48)+ui::Point(moveButton->Size.X+3, 0); ui::Button * deleteButton = new ui::Button(position, ui::Point((Size.X-position.X-8)-1, 16), "Delete"); //deleteButton->SetIcon(IconDelete); deleteButton->SetActionCallback(new DeleteAction(this)); signPosition.X = sim->signs[signID].x; signPosition.Y = sim->signs[signID].y; AddComponent(deleteButton); } MakeActiveWindow(); }