Exemple #1
0
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);
		}
	}
Exemple #2
0
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();
	}
Exemple #3
0
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));
		}
	}
Exemple #4
0
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;
	}
Exemple #5
0
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;
	}
Exemple #6
0
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);
		}
	}
Exemple #7
0
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);
	}
Exemple #9
0
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();
}
Exemple #10
0
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);
	}
Exemple #11
0
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);
	}
Exemple #12
0
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);
	}
Exemple #13
0
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();
	}
Exemple #15
0
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();
}
Exemple #16
0
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);
	}
Exemple #25
0
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);
	}
Exemple #26
0
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
	}
Exemple #27
0
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);
	}
Exemple #28
0
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);
	}
Exemple #29
0
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();
	}