GuiPane* GuiPane::addPane(const GuiText& text, GuiTheme::PaneStyle style) { Rect2D minRect = theme()->clientToPaneBounds(Rect2D::xywh(0,0,0,0), text, style); Vector2 pos = nextControlPos(); // Back up by the border size pos -= minRect.x0y0(); // Ensure the width isn't negative due to a very small m_clientRect // which would push the position off the parent panel float newRectWidth = max(m_clientRect.width() - pos.x * 2, 0.0f); Rect2D newRect = Rect2D::xywh(pos, Vector2(newRectWidth, minRect.height())); GuiPane* p = new GuiPane(this, text, newRect, style); containerArray.append(p); increaseBounds(p->rect().x1y1()); return p; }
void VideoRecordDialog::makeGUI() { pane()->addCheckBox("Record GUI (Surface2D)", &m_captureGUI); pane()->addLabel(GuiText("Video", shared_ptr<GFont>(), 12)); GuiPane* moviePane = pane()->addPane("", GuiTheme::ORNATE_PANE_STYLE); GuiLabel* label = NULL; GuiDropDownList* formatList = moviePane->addDropDownList("Format", m_formatList, &m_templateIndex); const float width = 300.0f; // Increase caption size to line up with the motion blur box const float captionSize = 90.0f; formatList->setWidth(width); formatList->setCaptionWidth(captionSize); moviePane->addNumberBox("Quality", &m_quality, "", GuiTheme::LOG_SLIDER, 0.1f, 25.0f); if (false) { // For future expansion GuiCheckBox* motionCheck = moviePane->addCheckBox("Motion Blur", &m_enableMotionBlur); m_framesBox = moviePane->addNumberBox("", &m_motionBlurFrames, "frames", GuiTheme::LINEAR_SLIDER, 2, 20); m_framesBox->setUnitsSize(46); m_framesBox->moveRightOf(motionCheck); m_framesBox->setWidth(210); } GuiNumberBox<float>* recordBox = moviePane->addNumberBox("Record as if", &m_recordFPS, "fps", GuiTheme::NO_SLIDER, 1.0f, 120.0f, 0.1f); recordBox->setCaptionWidth(captionSize); GuiNumberBox<float>* playbackBox = moviePane->addNumberBox("Playback at", &m_playbackFPS, "fps", GuiTheme::NO_SLIDER, 1.0f, 120.0f, 0.1f); playbackBox->setCaptionWidth(captionSize); const OSWindow* window = OSWindow::current(); int w = window->width() / 2; int h = window->height() / 2; moviePane->addCheckBox(format("Half-size (%d x %d)", w, h), &m_halfSize); if (false) { // For future expansion moviePane->addCheckBox("Show cursor", &m_showCursor); } label = moviePane->addLabel("Hot key:"); label->setWidth(captionSize); moviePane->addLabel(m_hotKeyString)->moveRightOf(label); // Add record on the same line as previous hotkey box m_recordButton = moviePane->addButton("Record Now (" + m_hotKeyString + ")"); m_recordButton->moveBy(moviePane->rect().width() - m_recordButton->rect().width() - 5, -27); moviePane->pack(); moviePane->setWidth(pane()->rect().width()); /////////////////////////////////////////////////////////////////////////////////// pane()->addLabel(GuiText("Screenshot", shared_ptr<GFont>(), 12)); GuiPane* ssPane = pane()->addPane("", GuiTheme::ORNATE_PANE_STYLE); m_ssFormatList.append("JPG", "PNG", "BMP", "TGA"); GuiDropDownList* ssFormatList = ssPane->addDropDownList("Format", m_ssFormatList, &m_ssFormatIndex); m_ssFormatIndex = 0; ssFormatList->setWidth(width); ssFormatList->setCaptionWidth(captionSize); label = ssPane->addLabel("Hot key:"); label->setWidth(captionSize); ssPane->addLabel(m_ssHotKeyString)->moveRightOf(label); ssPane->pack(); ssPane->setWidth(pane()->rect().width()); /////////////////////////////////////////////////////////////////////////////////// pack(); setRect(Rect2D::xywh(rect().x0(), rect().y0(), rect().width() + 5, rect().height() + 2)); }
CameraControlWindow::CameraControlWindow( const FirstPersonManipulatorRef& manualManipulator, const UprightSplineManipulatorRef& trackManipulator, const Pointer<Manipulator::Ref>& cameraManipulator, const GuiSkinRef& skin) : GuiWindow("Camera Control", skin, Rect2D::xywh(5, 54, 200, 0), GuiWindow::TOOL_FRAME_STYLE, GuiWindow::HIDE_ON_CLOSE), trackFileIndex(0), cameraManipulator(cameraManipulator), manualManipulator(manualManipulator), trackManipulator(trackManipulator), drawerButton(NULL), drawerButtonPane(NULL), m_expanded(false) { manualOperation = manualManipulator->active(); updateTrackFiles(); GuiPane* pane = GuiWindow::pane(); GFontRef iconFont = GFont::fromFile(System::findDataFile("icon.fnt")); GFontRef greekFont = GFont::fromFile(System::findDataFile("greek.fnt")); // The default G3D textbox label leaves too much space between // the box and the label, so we override it. pane->addLabel("xyz")->setPosition(5, 2); pane->addLabel(GuiCaption("qf", greekFont, 12))->setPosition(24, 2); cameraLocationTextBox = pane->addTextBox("", Pointer<std::string>(this, &CameraControlWindow::cameraLocation, &CameraControlWindow::setCameraLocation)); cameraLocationTextBox->setRect(Rect2D::xywh(-50, 2, 292, 24)); GuiPane* manualPane = pane->addPane(); manualPane->moveBy(-8, 0); manualPane->addCheckBox("Manual Control (F2)", &manualOperation)->moveBy(-2, -1); trackLabel = manualPane->addLabel("Path"); trackLabel->moveBy(0, -3); trackList = manualPane->addDropDownList("", &trackFileIndex, &trackFileArray); trackList->setRect(Rect2D::xywh(trackList->rect().x0y0() - Vector2(54, 25), Vector2(220, trackList->rect().height()))); visibleCheckBox = manualPane->addCheckBox("Visible", Pointer<bool>(trackManipulator, &UprightSplineManipulator::showPath, &UprightSplineManipulator::setShowPath)); visibleCheckBox->moveRightOf(trackList); visibleCheckBox->moveBy(6, 0); Vector2 buttonSize = Vector2(20, 20); recordButton = manualPane->addRadioButton (GuiCaption::Symbol::record(), UprightSplineManipulator::RECORD_KEY_MODE, trackManipulator.pointer(), &UprightSplineManipulator::mode, &UprightSplineManipulator::setMode, GuiRadioButton::TOOL_STYLE); recordButton->moveBy(38, 2); recordButton->setSize(buttonSize); playButton = manualPane->addRadioButton (GuiCaption::Symbol::play(), UprightSplineManipulator::PLAY_MODE, trackManipulator.pointer(), &UprightSplineManipulator::mode, &UprightSplineManipulator::setMode, GuiRadioButton::TOOL_STYLE); playButton->setSize(buttonSize); playButton->moveRightOf(recordButton); stopButton = manualPane->addRadioButton (GuiCaption::Symbol::stop(), UprightSplineManipulator::INACTIVE_MODE, trackManipulator.pointer(), &UprightSplineManipulator::mode, &UprightSplineManipulator::setMode, GuiRadioButton::TOOL_STYLE); stopButton->setSize(buttonSize); stopButton->moveRightOf(playButton); saveButton = manualPane->addButton("Save..."); saveButton->moveRightOf(stopButton); saveButton->setSize(saveButton->rect().wh() - Vector2(20, 1)); saveButton->moveBy(8, -3); saveButton->setEnabled(false); cyclicCheckBox = manualPane->addCheckBox("Cyclic", Pointer<bool>(trackManipulator, &UprightSplineManipulator::cyclic, &UprightSplineManipulator::setCyclic)); cyclicCheckBox->setPosition(visibleCheckBox->rect().x0(), saveButton->rect().y0() + 1); # ifdef G3D_OSX manualHelpCaption = GuiCaption("W,A,S,D and shift+left mouse to move.", NULL, 10); # else manualHelpCaption = GuiCaption("W,A,S,D and right mouse to move.", NULL, 10); # endif autoHelpCaption = ""; playHelpCaption = ""; recordHelpCaption = GuiCaption("Spacebar to place a control point.", NULL, 10); helpLabel = manualPane->addLabel(manualHelpCaption); helpLabel->moveBy(0, 2); manualPane->pack(); pack(); // Set the width here so that the client rect is correct below setRect(Rect2D::xywh(rect().x0y0(), bigSize)); // Make the pane width match the window width manualPane->setPosition(0, manualPane->rect().y0()); manualPane->setSize(clientRect().width(), manualPane->rect().height()); // Have to create the drawerButton last, otherwise the setRect // code for moving it to the bottom of the window will cause // layout to become broken. drawerCollapseCaption = GuiCaption("5", iconFont); drawerExpandCaption = GuiCaption("6", iconFont); drawerButtonPane = pane->addPane("", 0, GuiPane::NO_FRAME_STYLE); drawerButton = drawerButtonPane->addButton(drawerExpandCaption, GuiButton::TOOL_STYLE); drawerButton->setRect(Rect2D::xywh(0, 0, 12, 12)); drawerButtonPane->setSize(12, 12); // Resize the pane to include the drawer button so that it is not clipped pane->setSize(clientRect().wh()); setRect(Rect2D::xywh(rect().x0y0(), smallSize)); sync(); }