void Margin::draw(GLContextData& contextData) const { /* Draw the grandparent class widget: */ Container::draw(contextData); if(child!=0) { /* Draw the margin around the child widget: */ glBegin(GL_QUAD_STRIP); glColor(backgroundColor); glNormal3f(0.0f,0.0f,1.0f); glVertex(child->getExterior().getCorner(0)); glVertex(getInterior().getCorner(0)); glVertex(child->getExterior().getCorner(1)); glVertex(getInterior().getCorner(1)); glVertex(child->getExterior().getCorner(3)); glVertex(getInterior().getCorner(3)); glVertex(child->getExterior().getCorner(2)); glVertex(getInterior().getCorner(2)); glVertex(child->getExterior().getCorner(0)); glVertex(getInterior().getCorner(0)); glEnd(); /* Draw the child widgets: */ child->draw(contextData); } }
void ScaleBar::draw(GLContextData& contextData) const { /* Save and set OpenGL state: */ glPushAttrib(GL_COLOR_BUFFER_BIT|GL_ENABLE_BIT|GL_LINE_BIT); glDisable(GL_LIGHTING); /* Calculate the scale bar layout: */ GLfloat x0=getInterior().origin[0]+(getInterior().size[0]-GLfloat(currentPhysLength))*0.5f; GLfloat x1=x0+GLfloat(currentPhysLength); const GLLabel::Box::Vector& labelSize=lengthLabel->getLabelSize(); GLfloat y0=getInterior().origin[1]+(getInterior().size[1]-labelSize[1]*2.0f)*0.5f; GLfloat y1=y0+labelSize[1]; GLfloat y2=y1+labelSize[1]; /* Draw the scale bar: */ glLineWidth(5.0f); glBegin(GL_LINES); glColor(getBackgroundColor()); glVertex2f(x0,y1); glVertex2f(x1,y1); glEnd(); glLineWidth(3.0f); glBegin(GL_LINES); glVertex2f(x0,y0); glVertex2f(x0,y2); glVertex2f(x1,y0); glVertex2f(x1,y2); glColor(getForegroundColor()); glVertex2f(x0,y1); glVertex2f(x1,y1); glEnd(); glLineWidth(1.0f); glBegin(GL_LINES); glVertex2f(x0,y0); glVertex2f(x0,y2); glVertex2f(x1,y0); glVertex2f(x1,y2); glEnd(); /* Install a temporary deferred renderer: */ { GLLabel::DeferredRenderer dr(contextData); /* Draw the length and scale labels: */ // glEnable(GL_ALPHA_TEST); // glAlphaFunc(GL_GREATER,0.0f); lengthLabel->draw(contextData); scaleLabel->draw(contextData); } /* Restore OpenGL state: */ glPopAttrib(); }
void ScaleBar::pointerButtonDown(GLMotif::Event& event) { Scalar newScale=currentScale; /* Check if the event happened in the left or right corner: */ float relEventPos=(event.getWidgetPoint().getPoint()[0]-getInterior().origin[0])/getInterior().size[0]; if(relEventPos<=0.333f) { /* Calculate the next smaller quasi-binary scale factor: */ newScale=Scalar(getSmallerQuasiBinary(currentScale)); } else if(relEventPos>=0.667f) { /* Calculate the next bigger quasi-binary scale factor: */ newScale=Scalar(getBiggerQuasiBinary(currentScale)); } if(newScale!=currentScale&&activateNavigationTool(reinterpret_cast<const Tool*>(this))) { /* Adjust the navigation transformation: */ Scalar newNavScale; const Geometry::LinearUnit& unit=getCoordinateManager()->getUnit(); if(unit.isImperial()) { /* Calculate scale factor through imperial units: */ newNavScale=getInchFactor()*newScale/unit.getInchFactor(); } else { /* Calculate scale factor through metric units: */ newNavScale=getMeterFactor()*newScale/unit.getMeterFactor(); } /* Get the current navigation transformation and calculate the display center position in navigation coordinates: */ const NavTransform& nav=getNavigationTransformation(); Point center=nav.inverseTransform(getDisplayCenter()); /* Create the new navigation transformation: */ NavTransform newNav=NavTransform(nav.getTranslation(),nav.getRotation(),newNavScale); newNav.leftMultiply(NavTransform::translate(getDisplayCenter()-newNav.transform(center))); setNavigationTransformation(newNav); deactivateNavigationTool(reinterpret_cast<const Tool*>(this)); currentScale=newScale; /* Update the scale bar: */ calcSize(newNav); /* Resize the widget so that the clicked point stays in the same place: */ GLMotif::Vector newSize=calcNaturalSize(); GLfloat newInteriorWidth=newSize[0]-2.0f*getBorderWidth(); GLfloat newOrigin=event.getWidgetPoint().getPoint()[0]-newInteriorWidth*relEventPos-getBorderWidth(); resize(GLMotif::Box(GLMotif::Vector(newOrigin,0.0f,0.0f),newSize)); } }
void Image::setRegion(const GLfloat newRegion[4]) { /* Copy the new region extents: */ for(int i=0;i<4;++i) region[i]=newRegion[i]; /* Compare the new region's aspect ratio to the widget's interior's aspect ratio: */ GLfloat ww=getInterior().size[0]; GLfloat wh=getInterior().size[1]; GLfloat rw=(region[2]-region[0])/resolution[0]; GLfloat rh=(region[3]-region[1])/resolution[1]; if(ww*rh>rw*wh) // Interior is wider than region { /* Widen the region to match the interior: */ GLfloat delta=(rh*ww/wh-rw)*resolution[0]*0.5f; region[0]-=delta; region[2]+=delta; } else // Interior is narrower than region { /* Heighten the region to match the interior: */ GLfloat delta=(rw*wh/ww-rh)*resolution[1]*0.5f; region[1]-=delta; region[3]+=delta; } /* Calculate the image box: */ imageBox=getInterior(); if(region[0]<0.0f) { GLfloat delta=(0.0f-region[0])/(region[2]-region[0])*ww; imageBox.origin[0]+=delta; imageBox.size[0]-=delta; } if(region[2]>GLfloat(image.getWidth())) { GLfloat delta=(region[2]-GLfloat(image.getWidth()))/(region[2]-region[0])*ww; imageBox.size[0]-=delta; } if(region[1]<0.0f) { GLfloat delta=(0.0f-region[1])/(region[3]-region[1])*wh; imageBox.origin[1]+=delta; imageBox.size[1]-=delta; } if(region[3]>GLfloat(image.getHeight())) { GLfloat delta=(region[3]-GLfloat(image.getHeight()))/(region[3]-region[1])*wh; imageBox.size[1]-=delta; } /* Invalidate the cached region: */ ++regionVersion; }
ZRange DropdownButton::calcZRange(void) const { /* Calculate the parent class widget's z range: */ ZRange zRange=DecoratedButton::calcZRange(); /* Adjust for the cascade arrow: */ if(zRange.second<getInterior().origin[2]+arrowBorderSize) zRange.second=getInterior().origin[2]+arrowBorderSize; return zRange; }
void ScaleBar::resize(const GLMotif::Box& newExterior) { /* Resize the parent class widget: */ GLMotif::Widget::resize(newExterior); if(lengthLabel!=0) { /* Reposition the length label: */ const GLLabel::Box::Vector& labelSize=lengthLabel->getLabelSize(); GLLabel::Box::Vector labelPos; labelPos[0]=getInterior().origin[0]+(getInterior().size[0]-labelSize[0])*0.5f; labelPos[1]=getInterior().origin[1]+getInterior().size[1]*0.5f-labelSize[1]*1.5f; labelPos[2]=0.0f; lengthLabel->setOrigin(labelPos); } if(scaleLabel!=0) { /* Reposition the scale label: */ const GLLabel::Box::Vector& labelSize=scaleLabel->getLabelSize(); GLLabel::Box::Vector labelPos; labelPos[0]=getInterior().origin[0]+(getInterior().size[0]-labelSize[0])*0.5f; labelPos[1]=getInterior().origin[1]+getInterior().size[1]*0.5f+labelSize[1]*0.5f; labelPos[2]=0.0f; scaleLabel->setOrigin(labelPos); } }
MWWorld::CellStore *MWWorld::Cells::getCell (const ESM::CellId& id) { if (id.mPaged) return getExterior (id.mIndex.mX, id.mIndex.mY); return getInterior (id.mWorldspace); }
void ScrolledImage::resize(const Box& newExterior) { /* Resize the parent class widget: */ Container::resize(newExterior); /* Get the new interior size: */ Box iBox=getInterior(); /* Make room for and position the horizontal and vertical scroll bars: */ Vector hbSize=horizontalScrollBar->calcNaturalSize(); Vector vbSize=verticalScrollBar->calcNaturalSize(); Box hbBox=iBox; hbBox.size[0]-=vbSize[0]; hbBox.size[1]=hbSize[1]; horizontalScrollBar->resize(hbBox); Box vbBox=iBox; vbBox.size[0]=vbSize[0]; vbBox.origin[0]+=iBox.size[0]-vbBox.size[0]; vbBox.size[1]-=hbSize[1]; vbBox.origin[1]+=hbSize[1]; verticalScrollBar->resize(vbBox); /* Resize the image: */ iBox.size[0]-=vbSize[0]; iBox.size[1]-=hbSize[1]; iBox.origin[1]+=hbSize[1]; image->resize(iBox); /* Adjust the image's display region: */ setZoomFactor(zoomFactor); }
void ColorHexagon:: draw(GLContextData& contextData) const { //draw the parent class widget Widget::draw(contextData); //draw the background parts (not covered by the hexagon) glColor(backgroundColor); glBegin(GL_TRIANGLES); glVertex(corners[2]); glVertex(corners[1]); glVertex(getInterior().getCorner(3)); glVertex(getInterior().getCorner(2)); glVertex(corners[4]); glVertex(corners[3]); glVertex(corners[4]); glVertex(getInterior().getCorner(0)); glVertex(corners[5]); glVertex(corners[6]); glVertex(getInterior().getCorner(1)); glVertex(corners[1]); glEnd(); //backup OpenGL state glPushAttrib(GL_ENABLE_BIT); glDisable(GL_LIGHTING); //draw the hexagon glBegin(GL_TRIANGLE_FAN); for (int i=0; i<7; ++i) { glColor(colors[i]); glVertex(corners[i]); } glColor(colors[1]); glVertex(corners[1]); glEnd(); //restore OpenGL state glPopAttrib(); }
void Pager::resize(const Box& newExterior) { /* Resize the parent class widget: */ Container::resize(newExterior); /* Calculate the natural size of the page button box: */ Vector buttonSize(0.0f,0.0f,0.0f); for(ButtonList::iterator pbIt=pageButtons.begin();pbIt!=pageButtons.end();++pbIt) { /* Get the button's size: */ Vector s=(*pbIt)->calcNaturalSize(); /* Increment the box width: */ buttonSize[0]+=s[0]; /* Adjust the box height: */ if(buttonSize[1]<s[1]) buttonSize[1]=s[1]; } /* Resize and reposition the page buttons: */ buttonBox=getInterior(); buttonBox.origin[1]+=buttonBox.size[1]-buttonSize[1]; buttonBox.size[1]=buttonSize[1]; Box pbBox=buttonBox; for(ButtonList::iterator pbIt=pageButtons.begin();pbIt!=pageButtons.end();++pbIt) { /* Get the button's natural size: */ Vector s=(*pbIt)->calcNaturalSize(); /* Resize the current button: */ pbBox.size[0]=s[0]; (*pbIt)->resize(pbBox); /* Advance the button box position to the next button: */ pbBox.origin[0]+=pbBox.size[0]; } /* Resize and reposition all child widgets: */ childBox=getInterior(); childBox.size[1]-=buttonSize[1]; childBox.doInset(Vector(marginWidth,marginWidth,0.0f)); for(WidgetList::iterator cIt=children.begin();cIt!=children.end();++cIt) (*cIt)->resize(childBox); }
void Pager::draw(GLContextData& contextData) const { /* Draw the parent class widget: */ Container::draw(contextData); /* Bail out if there are no children: */ if(children.empty()) return; /* Draw a margin around the page buttons and the child widget area: */ glBegin(GL_TRIANGLE_FAN); glColor(backgroundColor); glNormal3f(0.0f,0.0f,1.0f); glVertex(getInterior().getCorner(0)); glVertex(getInterior().getCorner(1)); glVertex(childBox.getCorner(1)); glVertex(childBox.getCorner(0)); glVertex(childBox.getCorner(2)); glVertex(buttonBox.getCorner(0)); glVertex(buttonBox.getCorner(2)); glVertex(getInterior().getCorner(2)); glEnd(); glBegin(GL_TRIANGLE_FAN); glVertex(getInterior().getCorner(3)); glVertex(getInterior().getCorner(2)); glVertex(buttonBox.getCorner(2)); for(ButtonList::const_iterator pbIt=pageButtons.begin();pbIt!=pageButtons.end();++pbIt) glVertex((*pbIt)->getExterior().getCorner(3)); glVertex(buttonBox.getCorner(3)); glVertex(buttonBox.getCorner(1)); glVertex(getInterior().getCorner(1)); glEnd(); glBegin(GL_TRIANGLE_FAN); glVertex(childBox.getCorner(3)); glVertex(childBox.getCorner(1)); glVertex(getInterior().getCorner(1)); glVertex(buttonBox.getCorner(1)); for(ButtonList::const_reverse_iterator pbIt=pageButtons.rbegin();pbIt!=pageButtons.rend();++pbIt) glVertex((*pbIt)->getExterior().getCorner(1)); glVertex(buttonBox.getCorner(0)); glVertex(childBox.getCorner(2)); glEnd(); /* Fill the empty space next to the page buttons: */ glBegin(GL_QUADS); glVertex(pageButtons.back()->getExterior().getCorner(1)); glVertex(buttonBox.getCorner(1)); glVertex(buttonBox.getCorner(3)); glVertex(pageButtons.back()->getExterior().getCorner(3)); glEnd(); /* Draw the page buttons: */ for(ButtonList::const_iterator pbIt=pageButtons.begin();pbIt!=pageButtons.end();++pbIt) (*pbIt)->draw(contextData); /* Draw the currently displayed child widget: */ children[currentChildIndex]->draw(contextData); }
void TextFieldSlider::resize(const Box& newExterior) { /* Resize the parent class widget: */ Container::resize(newExterior); /* Position the text field: */ Box textFieldBox=getInterior(); textFieldBox.size=textField->calcNaturalSize(); textFieldBox.origin[1]+=(getInterior().size[1]-textFieldBox.size[1])*0.5f; textField->resize(textFieldBox); /* Position the slider: */ Box sliderBox=getInterior(); sliderBox.size=slider->calcNaturalSize(); sliderBox.origin[0]+=textFieldBox.size[0]+spacing; sliderBox.origin[1]+=(getInterior().size[1]-sliderBox.size[1])*0.5f; sliderBox.size[0]=getInterior().size[0]-textFieldBox.size[0]-spacing; slider->resize(sliderBox); }
void Popup::resize(const Box& newExterior) { #if 0 /* Center the widget around the origin: */ Box exterior=newExterior; exterior.origin[0]-=0.5f*exterior.size[0]; exterior.origin[1]-=0.5f*exterior.size[1]; #endif /* Resize the parent class widget: */ Container::resize(newExterior); /* Resize the title: */ GLfloat titleHeight=0.0f; if(title!=0) { Box titleRect=getInterior(); titleRect.origin[0]+=marginWidth; titleRect.size[0]-=2.0f*marginWidth; titleHeight=title->calcNaturalSize()[1]; titleRect.origin[1]+=titleRect.size[1]-marginWidth-titleHeight; titleRect.size[1]=titleHeight; title->resize(titleRect); /* Account for spacing between title and child: */ titleHeight+=titleSpacing; } /* Resize the child: */ if(child!=0) { Box childRect=getInterior(); childRect.origin[0]+=marginWidth; childRect.size[0]-=2.0f*marginWidth; childRect.origin[1]+=marginWidth; childRect.size[1]-=2.0f*marginWidth+titleHeight; child->resize(childRect); } /* Resize the parent class widget again to calculate the correct z range: */ Container::resize(newExterior); }
void ColorMap::resize(const Box& newExterior) { /* Resize the parent class widget: */ Widget::resize(newExterior); /* Adjust the color map area position: */ colorMapAreaBox=getInterior(); colorMapAreaBox.doInset(Vector(marginWidth,marginWidth,0.0f)); /* Update the color map area positions of all control points: */ updateControlPoints(); }
void ColorMapEditor:: resize(const Box& newExterior) { //resize the parent class widget Widget::resize(newExterior); //adjust the color map area position colorMapAreaBox = getInterior(); colorMapAreaBox.doInset(Vector(marginWidth, marginWidth, 0.0f)); //update the color map area positions of all control points updateControlPoints(); }
void ColorHexagon:: resize(const Box& newExterior) { /* Resize the parent class widget: */ Widget::resize(newExterior); /* Adjust the color hexagon area position: */ hexagonAreaBox = getInterior(); hexagonAreaBox.doInset(Vector(marginWidth,marginWidth,0.0f)); /* Update the color hexagon area positions of all control points: */ updateHexagon(); }
void DropdownBox::resize(const Box& newExterior) { /* Resize the parent class widget: */ Label::resize(newExterior); /* Position the dropdown arrow: */ Box arrowBox=getInterior().inset(Vector(marginWidth,marginWidth,0.0f)); arrowBox.origin[0]+=arrowBox.size[0]-arrow.getPreferredBoxSize(); arrowBox.size[0]=arrow.getPreferredBoxSize(); arrow.setGlyphBox(arrowBox); if(popup!=0) { /* Resize the popup to match the interior of the dropdown box: */ Box popupBox=popup->getExterior(); popupBox.size[0]=getExterior().size[0]-arrowBox.size[0]-spacing; popup->resize(popupBox); } }
void ColorBar::layout(void) { /* Get the interior size of the widget: */ Box inner=getInterior(); inner.inset(Vector(marginWidth,marginWidth,0.0f)); /* Align the vertical boxes: */ tickMarkLabelBox=inner; tickMarkLabelBox.size[1]=tickMarkLabelHeight; colorBarBox=inner; colorBarBox.origin[1]+=tickMarkLabelBox.size[1]+tickMarkHeight; colorBarBox.size[1]-=tickMarkLabelBox.size[1]+tickMarkHeight; /* Distribute the tick mark labels uniformly: */ GLfloat totalTickMarkLabelWidth=0.0f; for(int i=0;i<numTickMarks;++i) { /* Center the tick mark label under its tick mark: */ GLfloat x=tickMarkLabelBox.origin[0]+tickMarkLabelBox.size[0]*GLfloat(i)/GLfloat(numTickMarks-1); tickMarks[i].labelBox.origin[0]=x-tickMarks[i].labelBox.size[0]*0.5f; tickMarks[i].labelBox.origin[1]=tickMarkLabelBox.origin[1]+(tickMarkLabelHeight-tickMarks[i].labelBox.size[1])*0.5f; totalTickMarkLabelWidth+=tickMarks[i].labelBox.size[0]; } /* Shift the tick mark labels until they fit into the alloted box and don't overlap: */ GLfloat minSeparation=(tickMarkLabelBox.size[0]-totalTickMarkLabelWidth)/GLfloat(numTickMarks-1); if(minSeparation>tickMarkLabelSeparation) minSeparation=tickMarkLabelSeparation; GLfloat left=tickMarkLabelBox.origin[0]; GLfloat right=tickMarkLabelBox.origin[0]+tickMarkLabelBox.size[0]; for(int i=0;i<numTickMarks/2;++i) { /* Align i-th tick mark label from the left: */ if(tickMarks[i].labelBox.origin[0]<left) tickMarks[i].labelBox.origin[0]=left; left=tickMarks[i].labelBox.origin[0]+tickMarks[i].labelBox.size[0]+minSeparation; /* Align i-th tick mark label from the right: */ if(tickMarks[numTickMarks-i-1].labelBox.origin[0]>right-tickMarks[numTickMarks-i-1].labelBox.size[0]) tickMarks[numTickMarks-i-1].labelBox.origin[0]=right-tickMarks[numTickMarks-i-1].labelBox.size[0]; right=tickMarks[numTickMarks-i-1].labelBox.origin[0]-minSeparation; } }
/* * drawMargin - Draw margin area in background color. */ void SliceWidget::drawMargin(void) const { glColor(backgroundColor); glBegin(GL_QUADS); glNormal3f(0.0f, 0.0f, 1.0f); glVertex(getInterior().getCorner(0)); glVertex(SliceWidgetAreaBox.getCorner(0)); glVertex(SliceWidgetAreaBox.getCorner(2)); glVertex(getInterior().getCorner(2)); glVertex(getInterior().getCorner(1)); glVertex(getInterior().getCorner(3)); glVertex(SliceWidgetAreaBox.getCorner(3)); glVertex(SliceWidgetAreaBox.getCorner(1)); glVertex(getInterior().getCorner(0)); glVertex(getInterior().getCorner(1)); glVertex(SliceWidgetAreaBox.getCorner(1)); glVertex(SliceWidgetAreaBox.getCorner(0)); glVertex(getInterior().getCorner(2)); glVertex(SliceWidgetAreaBox.getCorner(2)); glVertex(SliceWidgetAreaBox.getCorner(3)); glVertex(getInterior().getCorner(3)); glEnd(); } // end drawMargin()
void DropdownBox::draw(GLContextData& contextData) const { /* Draw the base class widget: */ Widget::draw(contextData); /* Draw the margin and label separator: */ glColor(backgroundColor); /* Draw the top left margin part: */ glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,0.0f,1.0f); glVertex(getInterior().getCorner(2)); glVertex(getInterior().getCorner(0)); glVertex(label.getLabelBox().getCorner(0)); glVertex(label.getLabelBox().getCorner(2)); glVertex(label.getLabelBox().getCorner(3)); glVertex(arrow.getGlyphBox().getCorner(2)); glVertex(arrow.getGlyphBox().getCorner(3)); glVertex(getInterior().getCorner(3)); glEnd(); /* Draw the bottom right margin part: */ glBegin(GL_TRIANGLE_FAN); glVertex(getInterior().getCorner(1)); glVertex(getInterior().getCorner(3)); glVertex(arrow.getGlyphBox().getCorner(3)); glVertex(arrow.getGlyphBox().getCorner(1)); glVertex(arrow.getGlyphBox().getCorner(0)); glVertex(label.getLabelBox().getCorner(1)); glVertex(label.getLabelBox().getCorner(0)); glVertex(getInterior().getCorner(0)); glEnd(); /* Draw the label separator: */ glBegin(GL_QUADS); glVertex(label.getLabelBox().getCorner(3)); glVertex(label.getLabelBox().getCorner(1)); glVertex(arrow.getGlyphBox().getCorner(0)); glVertex(arrow.getGlyphBox().getCorner(2)); glEnd(); /* Draw the dropdown arrow: */ arrow.draw(contextData); /* Draw the label: */ label.draw(contextData); }
void ScrolledListBox::draw(GLContextData& contextData) const { /* Draw the parent class widget: */ Container::draw(contextData); /* Draw the margin around the child widgets: */ glColor(backgroundColor); /* Draw the top left margin part: */ glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,0.0f,1.0f); glVertex(getInterior().getCorner(2)); glVertex(getInterior().getCorner(0)); if(horizontalScrollBar!=0) glVertex(horizontalScrollBar->getExterior().getCorner(0)); glVertex(listBox->getExterior().getCorner(0)); glVertex(listBox->getExterior().getCorner(2)); glVertex(listBox->getExterior().getCorner(3)); glVertex(verticalScrollBar->getExterior().getCorner(3)); glVertex(getInterior().getCorner(3)); glEnd(); /* Draw the bottom right margin part: */ glBegin(GL_TRIANGLE_FAN); glVertex(getInterior().getCorner(1)); glVertex(getInterior().getCorner(3)); glVertex(verticalScrollBar->getExterior().getCorner(3)); glVertex(verticalScrollBar->getExterior().getCorner(1)); glVertex(listBox->getExterior().getCorner(1)); if(horizontalScrollBar!=0) { glVertex(horizontalScrollBar->getExterior().getCorner(1)); glVertex(horizontalScrollBar->getExterior().getCorner(0)); } else glVertex(listBox->getExterior().getCorner(0)); glVertex(getInterior().getCorner(0)); glEnd(); /* Draw the list box and scroll bars: */ listBox->draw(contextData); verticalScrollBar->draw(contextData); if(horizontalScrollBar!=0) horizontalScrollBar->draw(contextData); }
void DropdownBox::pointerButtonDown(Event& event) { /* "Repair" the incoming event: */ event.overrideTargetWidget(foundChild); /* Pop up the secondary top-level widget: */ if(numItems>0&&!isPopped&&popup!=0) { /* Calculate the popup's transformation: */ Vector offset=getInterior().getCorner(0); Button* child=static_cast<Button*>(items->getChild(selectedItem)); Vector popupHotSpot=child->getInterior().getCorner(0); offset[0]-=popupHotSpot[0]; offset[1]-=popupHotSpot[1]; offset[2]-=popupHotSpot[2]; offset[2]-=popup->getZRange().first; getManager()->popupSecondaryWidget(this,popup,offset); isPopped=true; /* Calculate the extended "hit box" around the popup: */ popupHitBox=popup->getExterior(); ZRange popupZRange=popup->getZRange(); popupHitBox.origin[2]=popupZRange.first; popupHitBox.size[2]=popupZRange.second-popupZRange.first; popupHitBox.doOffset(offset); popupHitBox.doOutset(Vector(popupExtrudeSize,popupExtrudeSize,popupExtrudeSize)); /* Find a potential event recipient in the popup: */ if(popup->findRecipient(event)) { armedChild=event.getTargetWidget(); armedChild->pointerButtonDown(event); } else armedChild=0; } }
void ScrolledListBox::resize(const Box& newExterior) { /* Resize the parent class widget: */ Container::resize(newExterior); if(!isManaged) return; /* Get the new interior size: */ Box lbBox=getInterior(); /* Make room for and position the vertical scroll bar: */ Vector vbSize=verticalScrollBar->calcNaturalSize(); Box vbBox=lbBox; vbBox.origin[0]+=lbBox.size[0]-vbSize[0]; vbBox.size[0]=vbSize[0]; lbBox.size[0]-=vbSize[0]; Box hbBox; if(horizontalScrollBar!=0) { /* Make room for and position the horizontal scroll bar: */ Vector hbSize=horizontalScrollBar->calcNaturalSize(); hbBox=lbBox; hbBox.size[1]=hbSize[1]; lbBox.origin[1]+=hbSize[1]; lbBox.size[1]-=hbSize[1]; vbBox.origin[1]+=hbSize[1]; vbBox.size[1]-=hbSize[1]; } /* Resize the list box and scroll bars: */ listBox->resize(lbBox); verticalScrollBar->resize(vbBox); if(horizontalScrollBar!=0) horizontalScrollBar->resize(hbBox); }
void ScrolledImage::draw(GLContextData& contextData) const { /* Draw the parent class widget: */ Container::draw(contextData); /* Draw the margin around the child widgets: */ const Box& iBox=image->getExterior(); const Box& hbBox=horizontalScrollBar->getExterior(); const Box& vbBox=verticalScrollBar->getExterior(); glColor(backgroundColor); /* Draw the top left margin part: */ glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,0.0f,1.0f); glVertex(getInterior().getCorner(2)); glVertex(getInterior().getCorner(0)); glVertex(hbBox.getCorner(0)); glVertex(hbBox.getCorner(2)); glVertex(iBox.getCorner(0)); glVertex(iBox.getCorner(2)); glVertex(iBox.getCorner(3)); glVertex(vbBox.getCorner(3)); glVertex(getInterior().getCorner(3)); glEnd(); /* Draw the bottom right margin part: */ glBegin(GL_TRIANGLE_FAN); glVertex(getInterior().getCorner(1)); glVertex(getInterior().getCorner(3)); glVertex(vbBox.getCorner(3)); glVertex(vbBox.getCorner(1)); glVertex(vbBox.getCorner(0)); glVertex(hbBox.getCorner(3)); glVertex(hbBox.getCorner(1)); glVertex(hbBox.getCorner(0)); glVertex(getInterior().getCorner(0)); glEnd(); /* Draw the image and scroll bars: */ image->draw(contextData); horizontalScrollBar->draw(contextData); verticalScrollBar->draw(contextData); }
void Popup::draw(GLContextData& contextData) const { /* Draw the parent class widget: */ Container::draw(contextData); /* Draw the widget's back side: */ Box back=getExterior().offset(Vector(0.0,0.0,getZRange().first)); glColor(borderColor); glBegin(GL_QUADS); glNormal3f(0.0f,0.0f,-1.0f); glVertex(back.getCorner(0)); glVertex(back.getCorner(2)); glVertex(back.getCorner(3)); glVertex(back.getCorner(1)); glNormal3f(0.0f,-1.0f,0.0f); glVertex(back.getCorner(0)); glVertex(back.getCorner(1)); glVertex(getExterior().getCorner(1)); glVertex(getExterior().getCorner(0)); glNormal3f(1.0f,0.0f,0.0f); glVertex(back.getCorner(1)); glVertex(back.getCorner(3)); glVertex(getExterior().getCorner(3)); glVertex(getExterior().getCorner(1)); glNormal3f(0.0f,1.0f,0.0f); glVertex(back.getCorner(3)); glVertex(back.getCorner(2)); glVertex(getExterior().getCorner(2)); glVertex(getExterior().getCorner(3)); glNormal3f(-1.0f,0.0f,0.0f); glVertex(back.getCorner(2)); glVertex(back.getCorner(0)); glVertex(getExterior().getCorner(0)); glVertex(getExterior().getCorner(2)); glEnd(); /* Draw the margin and title separator: */ glColor(backgroundColor); /* Draw the top left margin part: */ glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,0.0f,1.0f); glVertex(getInterior().getCorner(2)); glVertex(getInterior().getCorner(0)); if(child!=0) { glVertex(child->getExterior().getCorner(0)); glVertex(child->getExterior().getCorner(2)); } if(title!=0) { glVertex(title->getExterior().getCorner(0)); glVertex(title->getExterior().getCorner(2)); glVertex(title->getExterior().getCorner(3)); } else if(child!=0) glVertex(child->getExterior().getCorner(3)); glVertex(getInterior().getCorner(3)); glEnd(); /* Draw the bottom right margin part: */ glBegin(GL_TRIANGLE_FAN); glVertex(getInterior().getCorner(1)); glVertex(getInterior().getCorner(3)); if(title!=0) { glVertex(title->getExterior().getCorner(3)); glVertex(title->getExterior().getCorner(1)); } if(child!=0) { glVertex(child->getExterior().getCorner(3)); glVertex(child->getExterior().getCorner(1)); glVertex(child->getExterior().getCorner(0)); } else if(title!=0) glVertex(title->getExterior().getCorner(0)); glVertex(getInterior().getCorner(0)); glEnd(); /* Draw the title separator: */ if(title!=0&&child!=0) { glBegin(GL_QUADS); glVertex(child->getExterior().getCorner(2)); glVertex(child->getExterior().getCorner(3)); glVertex(title->getExterior().getCorner(1)); glVertex(title->getExterior().getCorner(0)); glEnd(); } /* Draw the title and child: */ if(title!=0) title->draw(contextData); if(child!=0) child->draw(contextData); }
void PopupWindow::draw(GLContextData& contextData) const { #if GLMOTIF_POPUPWINDOW_USE_RENDERCACHE /* Retrieve the data item: */ DataItem* dataItem=contextData.retrieveDataItem<DataItem>(this); /* Check if the display list's contents are current: */ if(dataItem->version==version) { /* Render the geometry stored in the display list: */ glCallList(dataItem->displayListId); /* Bail out: */ return; } else { /* Cache the popup window's visual representation into the display list: */ glNewList(dataItem->displayListId,GL_COMPILE_AND_EXECUTE); } #endif /* Draw the popup window's back side: */ Box back=getExterior().offset(Vector(0.0,0.0,getZRange().first)); glColor(borderColor); glBegin(GL_QUADS); glNormal3f(0.0f,0.0f,-1.0f); glVertex(back.getCorner(0)); glVertex(back.getCorner(2)); glVertex(back.getCorner(3)); glVertex(back.getCorner(1)); glNormal3f(0.0f,-1.0f,0.0f); glVertex(back.getCorner(0)); glVertex(back.getCorner(1)); glVertex(getExterior().getCorner(1)); glVertex(getExterior().getCorner(0)); glEnd(); glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0f,1.0f,0.0f); glVertex(back.getCorner(3)); glVertex(back.getCorner(2)); glVertex(titleBar->getExterior().getCorner(2)); glVertex(titleBar->getExterior().getCorner(3)); if(hideButton!=0) glVertex(hideButton->getExterior().getCorner(3)); if(closeButton!=0) glVertex(closeButton->getExterior().getCorner(3)); glEnd(); glBegin(GL_TRIANGLE_FAN); glNormal3f(-1.0f,0.0f,0.0f); glVertex(back.getCorner(2)); glVertex(back.getCorner(0)); glVertex(getExterior().getCorner(0)); glVertex(titleBar->getExterior().getCorner(0)); glVertex(titleBar->getExterior().getCorner(2)); glEnd(); glBegin(GL_TRIANGLE_FAN); glNormal3f(1.0f,0.0f,0.0f); glVertex(back.getCorner(1)); glVertex(back.getCorner(3)); if(closeButton!=0) { glVertex(closeButton->getExterior().getCorner(3)); glVertex(closeButton->getExterior().getCorner(1)); } else if(hideButton!=0) { glVertex(hideButton->getExterior().getCorner(3)); glVertex(hideButton->getExterior().getCorner(1)); } else { glVertex(titleBar->getExterior().getCorner(3)); glVertex(titleBar->getExterior().getCorner(1)); } glVertex(getExterior().getCorner(1)); glEnd(); /* Draw the title bar: */ titleBar->draw(contextData); if(hideButton!=0) hideButton->draw(contextData); if(closeButton!=0) closeButton->draw(contextData); /* Draw the child border: */ Box childBorder=getInterior(); childBorder.size[1]-=titleBar->getExterior().size[1]; Box childBox=childBorder; childBox.doInset(Vector(childBorderWidth,childBorderWidth,0.0f)); glColor(backgroundColor); glBegin(GL_QUAD_STRIP); glNormal3f(0.0f,0.0f,1.0f); glVertex(childBox.getCorner(0)); glVertex(childBorder.getCorner(0)); glVertex(childBox.getCorner(1)); glVertex(childBorder.getCorner(1)); glVertex(childBox.getCorner(3)); glVertex(childBorder.getCorner(3)); glVertex(childBox.getCorner(2)); glVertex(childBorder.getCorner(2)); glVertex(childBox.getCorner(0)); glVertex(childBorder.getCorner(0)); glEnd(); /* Draw the child: */ if(child!=0) child->draw(contextData); #if GLMOTIF_POPUPWINDOW_USE_RENDERCACHE if(dataItem->version!=version) { /* Finish caching the popup window's visual representation: */ glEndList(); /* Mark the display list as up-to-date: */ dataItem->version=version; } #endif }
void PopupWindow::resize(const Box& newExterior) { /* Resize the parent class widget: */ Container::resize(newExterior); /* Resize the title bar: */ Box titleBarRect=getInterior(); GLfloat titleBarHeight=titleBar->calcNaturalSize()[1]; GLfloat hcbSize=0.0f; if(hideButton!=0) { Vector hbSize=hideButton->calcNaturalSize(); if(hcbSize<hbSize[0]) hcbSize=hbSize[0]; if(hcbSize<hbSize[1]) hcbSize=hbSize[1]; } if(closeButton!=0) { Vector cbSize=closeButton->calcNaturalSize(); if(hcbSize<cbSize[0]) hcbSize=cbSize[0]; if(hcbSize<cbSize[1]) hcbSize=cbSize[1]; } if(titleBarHeight<hcbSize) titleBarHeight=hcbSize; if(hideButton!=0) titleBarRect.size[0]-=titleBarHeight; if(closeButton!=0) titleBarRect.size[0]-=titleBarHeight; titleBarRect.origin[1]+=titleBarRect.size[1]-titleBarHeight; titleBarRect.size[1]=titleBarHeight; titleBar->resize(titleBarRect); if(hideButton!=0) { Box hbRect=titleBarRect; hbRect.origin[0]+=hbRect.size[0]; hbRect.size[0]=titleBarHeight; hideButton->resize(hbRect); titleBarRect.size[0]+=titleBarHeight; } if(closeButton!=0) { Box cbRect=titleBarRect; cbRect.origin[0]+=cbRect.size[0]; cbRect.size[0]=titleBarHeight; closeButton->resize(cbRect); titleBarRect.size[0]+=titleBarHeight; } /* Resize the child: */ if(child!=0) { Box childRect=getInterior(); childRect.origin[0]+=childBorderWidth; childRect.size[0]-=2.0f*childBorderWidth; childRect.origin[1]+=childBorderWidth; childRect.size[1]-=2.0f*childBorderWidth+titleBarHeight; child->resize(childRect); } /* Resize the parent class widget again to calculate the correct z range: */ Container::resize(newExterior); }
void TextFieldSlider::draw(GLContextData& contextData) const { /* Draw the parent class widget: */ Container::draw(contextData); /* Draw the margin around the child widgets: */ glColor(backgroundColor); GLfloat midx=getInterior().origin[0]+textField->getExterior().size[0]+spacing*0.5f; GLfloat y1=getInterior().origin[1]; GLfloat y2=y1+getInterior().size[1]; glBegin(GL_TRIANGLES); glNormal3f(0.0f,0.0f,1.0f); glVertex(getInterior().getCorner(0)); glVertex(getInterior().getCorner(0)); glVertex(midx,y1,getInterior().origin[2]); glVertex(getInterior().getCorner(3)); glVertex(getInterior().getCorner(2)); glVertex(midx,y2,getInterior().origin[2]); glEnd(); /* Draw the margin around the text field: */ glBegin(GL_QUAD_STRIP); glVertex(textField->getExterior().getCorner(0)); glVertex(getInterior().getCorner(0)); glVertex(textField->getExterior().getCorner(1)); glVertex(midx,y1,getInterior().origin[2]); glVertex(textField->getExterior().getCorner(3)); glVertex(midx,y2,getInterior().origin[2]); glVertex(textField->getExterior().getCorner(2)); glVertex(getInterior().getCorner(2)); glVertex(textField->getExterior().getCorner(0)); glVertex(getInterior().getCorner(0)); glEnd(); /* Draw the margin around the slider: */ glBegin(GL_QUAD_STRIP); glVertex(slider->getExterior().getCorner(1)); glVertex(getInterior().getCorner(1)); glVertex(slider->getExterior().getCorner(3)); glVertex(getInterior().getCorner(3)); glVertex(slider->getExterior().getCorner(2)); glVertex(midx,y2,getInterior().origin[2]); glVertex(slider->getExterior().getCorner(0)); glVertex(midx,y1,getInterior().origin[2]); glVertex(slider->getExterior().getCorner(1)); glVertex(getInterior().getCorner(1)); glEnd(); /* Draw the child widgets: */ textField->draw(contextData); slider->draw(contextData); }
void Image::draw(GLContextData& contextData) const { /* Draw parent class decorations: */ Widget::draw(contextData); /* Draw the image frame, in case there is one: */ glBegin(GL_QUAD_STRIP); glColor(getBackgroundColor()); glNormal3f(0.0f,0.0f,1.0f); glVertex(imageBox.getCorner(0)); glVertex(getInterior().getCorner(0)); glVertex(imageBox.getCorner(1)); glVertex(getInterior().getCorner(1)); glVertex(imageBox.getCorner(3)); glVertex(getInterior().getCorner(3)); glVertex(imageBox.getCorner(2)); glVertex(getInterior().getCorner(2)); glVertex(imageBox.getCorner(0)); glVertex(getInterior().getCorner(0)); glEnd(); /* Get the context data item: */ DataItem* dataItem=contextData.retrieveDataItem<DataItem>(this); /* Set up OpenGL state: */ glPushAttrib(GL_ENABLE_BIT); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE); /* Bind the texture object: */ glBindTexture(GL_TEXTURE_2D,dataItem->textureObjectId); /* Check if the texture object is outdated: */ if(dataItem->version!=version) { /* Upload the new texture image: */ image.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB8,!dataItem->npotdtSupported); /* Update the texture image's size: */ if(dataItem->npotdtSupported) { /* Copy the image's size: */ for(int i=0;i<2;++i) dataItem->textureSize[i]=image.getSize(i); } else { /* Power-of-two pad the image's size: */ for(int i=0;i<2;++i) for(dataItem->textureSize[i]=1;dataItem->textureSize[i]<image.getSize(i);dataItem->textureSize[i]<<=1) ; } /* Mark the texture object as up-to-date: */ dataItem->version=version; } /* Check if the texture coordinate cache is outdated: */ if(dataItem->regionVersion!=regionVersion) { /* Calculate the new image region's texture coordinates: */ dataItem->regionTex[0]=GLfloat(region[0])/GLfloat(dataItem->textureSize[0]); if(dataItem->regionTex[0]<0.0f) dataItem->regionTex[0]=0.0f; dataItem->regionTex[1]=GLfloat(region[1])/GLfloat(dataItem->textureSize[1]); if(dataItem->regionTex[1]<0.0f) dataItem->regionTex[1]=0.0f; dataItem->regionTex[2]=GLfloat(region[2])/GLfloat(dataItem->textureSize[0]); if(dataItem->regionTex[2]>GLfloat(image.getWidth())/dataItem->textureSize[0]) dataItem->regionTex[2]=GLfloat(image.getWidth())/dataItem->textureSize[0]; dataItem->regionTex[3]=GLfloat(region[3])/GLfloat(dataItem->textureSize[1]); if(dataItem->regionTex[3]>GLfloat(image.getHeight())/dataItem->textureSize[1]) dataItem->regionTex[3]=GLfloat(image.getHeight())/dataItem->textureSize[1]; /* Mark the texture coordinate cache as up-to-date: */ dataItem->regionVersion=regionVersion; } /* Draw the image: */ glBegin(GL_QUADS); glTexCoord2f(dataItem->regionTex[0],dataItem->regionTex[1]); glVertex(imageBox.getCorner(0)); glTexCoord2f(dataItem->regionTex[2],dataItem->regionTex[1]); glVertex(imageBox.getCorner(1)); glTexCoord2f(dataItem->regionTex[2],dataItem->regionTex[3]); glVertex(imageBox.getCorner(3)); glTexCoord2f(dataItem->regionTex[0],dataItem->regionTex[3]); glVertex(imageBox.getCorner(2)); glEnd(); /* Protect the texture object: */ glBindTexture(GL_TEXTURE_2D,0); /* Restore OpenGL state: */ glPopAttrib(); }
void ColorMap::draw(GLContextData& contextData) const { /* Draw the parent class widget: */ Widget::draw(contextData); /* Draw the margin area with the background color: */ glColor(backgroundColor); glBegin(GL_QUADS); glNormal3f(0.0f,0.0f,1.0f); glVertex(getInterior().getCorner(0)); glVertex(colorMapAreaBox.getCorner(0)); glVertex(colorMapAreaBox.getCorner(2)); glVertex(getInterior().getCorner(2)); glVertex(getInterior().getCorner(1)); glVertex(getInterior().getCorner(3)); glVertex(colorMapAreaBox.getCorner(3)); glVertex(colorMapAreaBox.getCorner(1)); glEnd(); GLfloat y1=colorMapAreaBox.getCorner(0)[1]; GLfloat y2=colorMapAreaBox.getCorner(2)[1]; GLfloat z=colorMapAreaBox.getCorner(0)[2]; glBegin(GL_TRIANGLE_FAN); glVertex(getInterior().getCorner(0)); glVertex(getInterior().getCorner(1)); for(const ControlPoint* cpPtr=&last;cpPtr!=0;cpPtr=cpPtr->left) glVertex3f(cpPtr->x,y1,z); glEnd(); glBegin(GL_TRIANGLE_FAN); glVertex(getInterior().getCorner(3)); glVertex(getInterior().getCorner(2)); for(const ControlPoint* cpPtr=&first;cpPtr!=0;cpPtr=cpPtr->right) glVertex3f(cpPtr->x,y2,z); glEnd(); /* Draw the color map area: */ GLboolean lightingEnabled=glIsEnabled(GL_LIGHTING); if(lightingEnabled) glDisable(GL_LIGHTING); glBegin(GL_QUAD_STRIP); for(const ControlPoint* cpPtr=&first;cpPtr!=0;cpPtr=cpPtr->right) { glColor(cpPtr->color); glVertex3f(cpPtr->x,y2,z); glVertex3f(cpPtr->x,y1,z); } glEnd(); GLfloat lineWidth; glGetFloatv(GL_LINE_WIDTH,&lineWidth); glLineWidth(3.0f); glColor3f(0.0f,0.0f,0.0f); glBegin(GL_LINE_STRIP); for(const ControlPoint* cpPtr=&first;cpPtr!=0;cpPtr=cpPtr->right) glVertex3f(cpPtr->x,cpPtr->y,z+marginWidth*0.25f); glEnd(); glLineWidth(1.0f); glColor3f(1.0f,1.0f,1.0f); glBegin(GL_LINE_STRIP); for(const ControlPoint* cpPtr=&first;cpPtr!=0;cpPtr=cpPtr->right) glVertex3f(cpPtr->x,cpPtr->y,z+marginWidth*0.25f); glEnd(); if(lightingEnabled) glEnable(GL_LIGHTING); glLineWidth(lineWidth); /* Draw a button for each control point: */ GLfloat nl=1.0f/Math::sqrt(3.0f); glBegin(GL_TRIANGLES); for(const ControlPoint* cpPtr=&first;cpPtr!=0;cpPtr=cpPtr->right) { if(cpPtr==selected) glColor(selectedControlPointColor); else glColor(foregroundColor); glNormal3f(-nl,nl,nl); glVertex3f(cpPtr->x-controlPointSize,cpPtr->y,z); glVertex3f(cpPtr->x,cpPtr->y,z+controlPointSize); glVertex3f(cpPtr->x,cpPtr->y+controlPointSize,z); glNormal3f(nl,nl,nl); glVertex3f(cpPtr->x,cpPtr->y+controlPointSize,z); glVertex3f(cpPtr->x,cpPtr->y,z+controlPointSize); glVertex3f(cpPtr->x+controlPointSize,cpPtr->y,z); glNormal3f(nl,-nl,nl); glVertex3f(cpPtr->x+controlPointSize,cpPtr->y,z); glVertex3f(cpPtr->x,cpPtr->y,z+controlPointSize); glVertex3f(cpPtr->x,cpPtr->y-controlPointSize,z); glNormal3f(-nl,-nl,nl); glVertex3f(cpPtr->x,cpPtr->y-controlPointSize,z); glVertex3f(cpPtr->x,cpPtr->y,z+controlPointSize); glVertex3f(cpPtr->x-controlPointSize,cpPtr->y,z); } glEnd(); }