X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=Cura%2Fgui%2Futil%2FopenglGui.py;h=c9b0eeebe684408fc0d1573e2f3cf0e14a7879dd;hb=6208201bafdeaf82883181471c6da3a41283cfe7;hp=7c7b34186aa741567285bd4182856a69d22122bf;hpb=bd1b7508adf4c6b92bd78e38f056255d5bada322;p=cura.git diff --git a/Cura/gui/util/openglGui.py b/Cura/gui/util/openglGui.py index 7c7b3418..c9b0eeeb 100644 --- a/Cura/gui/util/openglGui.py +++ b/Cura/gui/util/openglGui.py @@ -1,5 +1,6 @@ from __future__ import absolute_import from __future__ import division +__copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License" import wx import traceback @@ -9,9 +10,10 @@ import time from wx import glcanvas import OpenGL -OpenGL.ERROR_CHECKING = False +#OpenGL.ERROR_CHECKING = False from OpenGL.GL import * +from Cura.util import version from Cura.gui.util import opengl class animation(object): @@ -123,7 +125,7 @@ class glGuiContainer(glGuiControl): class glGuiPanel(glcanvas.GLCanvas): def __init__(self, parent): - attribList = (glcanvas.WX_GL_RGBA, glcanvas.WX_GL_DOUBLEBUFFER, glcanvas.WX_GL_DEPTH_SIZE, 32, glcanvas.WX_GL_STENCIL_SIZE, 8) + attribList = (glcanvas.WX_GL_RGBA, glcanvas.WX_GL_DOUBLEBUFFER, glcanvas.WX_GL_DEPTH_SIZE, 24, glcanvas.WX_GL_STENCIL_SIZE, 8, 0) glcanvas.GLCanvas.__init__(self, parent, style=wx.WANTS_CHARS, attribList = attribList) self._base = self self._focus = None @@ -139,6 +141,7 @@ class glGuiPanel(glcanvas.GLCanvas): self._animationList = [] self.glReleaseList = [] self._refreshQueued = False + self._idleCalled = False wx.EVT_PAINT(self, self._OnGuiPaint) wx.EVT_SIZE(self, self._OnSize) @@ -158,6 +161,7 @@ class glGuiPanel(glcanvas.GLCanvas): wx.EVT_IDLE(self, self._OnIdle) def _OnIdle(self, e): + self._idleCalled = True if len(self._animationList) > 0 or self._refreshQueued: self._refreshQueued = False for anim in self._animationList: @@ -195,6 +199,7 @@ class glGuiPanel(glcanvas.GLCanvas): self.OnMouseMotion(e) def _OnGuiPaint(self, e): + self._idleCalled = False h = self.GetSize().GetHeight() w = self.GetSize().GetWidth() oldButtonSize = self._buttonSize @@ -219,19 +224,29 @@ class glGuiPanel(glcanvas.GLCanvas): for obj in self.glReleaseList: obj.release() del self.glReleaseList[:] + renderStartTime = time.time() self.OnPaint(e) self._drawGui() glFlush() + if version.isDevVersion(): + renderTime = time.time() - renderStartTime + if renderTime == 0: + renderTime = 0.001 + glLoadIdentity() + glTranslate(10, self.GetSize().GetHeight() - 30, -1) + glColor4f(0.2,0.2,0.2,0.5) + opengl.glDrawStringLeft("fps:%d" % (1 / renderTime)) self.SwapBuffers() except: - errStr = 'An error has occurred during the 3D view drawing.' + errStr = _("An error has occurred during the 3D view drawing.") tb = traceback.extract_tb(sys.exc_info()[2]) errStr += "\n%s: '%s'" % (str(sys.exc_info()[0].__name__), str(sys.exc_info()[1])) for n in xrange(len(tb)-1, -1, -1): locationInfo = tb[n] errStr += "\n @ %s:%s:%d" % (os.path.basename(locationInfo[0]), locationInfo[2], locationInfo[1]) if not self._shownError: - wx.CallAfter(wx.MessageBox, errStr, '3D window error', wx.OK | wx.ICON_EXCLAMATION) + traceback.print_exc() + wx.CallAfter(wx.MessageBox, errStr, _("3D window error"), wx.OK | wx.ICON_EXCLAMATION) self._shownError = True def _drawGui(self): @@ -254,25 +269,26 @@ class glGuiPanel(glcanvas.GLCanvas): self._container.draw() - glBindTexture(GL_TEXTURE_2D, self._glRobotTexture) - glEnable(GL_TEXTURE_2D) - glPushMatrix() - glColor4f(1,1,1,1) - glTranslate(size.GetWidth() - 8,size.GetHeight() - 16,0) - s = self._buttonSize * 1.4 - glScale(s,s,s) - glBegin(GL_QUADS) - glTexCoord2f(1, 0) - glVertex2f(0,-1) - glTexCoord2f(0, 0) - glVertex2f(-1,-1) - glTexCoord2f(0, 1) - glVertex2f(-1, 0) - glTexCoord2f(1, 1) - glVertex2f(0, 0) - glEnd() - glDisable(GL_TEXTURE_2D) - glPopMatrix() + # glBindTexture(GL_TEXTURE_2D, self._glRobotTexture) + # glEnable(GL_TEXTURE_2D) + # glPushMatrix() + # glColor4f(1,1,1,1) + # glTranslate(size.GetWidth(),size.GetHeight(),0) + # s = self._buttonSize * 1 + # glScale(s,s,s) + # glTranslate(-1.2,-0.2,0) + # glBegin(GL_QUADS) + # glTexCoord2f(1, 0) + # glVertex2f(0,-1) + # glTexCoord2f(0, 0) + # glVertex2f(-1,-1) + # glTexCoord2f(0, 1) + # glVertex2f(-1, 0) + # glTexCoord2f(1, 1) + # glVertex2f(0, 0) + # glEnd() + # glDisable(GL_TEXTURE_2D) + # glPopMatrix() def _OnEraseBackground(self,event): #Workaround for windows background redraw flicker. @@ -300,7 +316,10 @@ class glGuiPanel(glcanvas.GLCanvas): wx.CallAfter(self._queueRefresh) def _queueRefresh(self): - self._refreshQueued = True + if self._idleCalled: + wx.CallAfter(self.Refresh) + else: + self._refreshQueued = True def add(self, ctrl): if self._container is not None: @@ -322,7 +341,7 @@ class glGuiLayoutButtons(object): else: x = pos[0] * gridSize + bs * 0.2 if pos[1] < 0: - y = h + pos[1] * gridSize * 1.2 - bs * 0.2 + y = h + pos[1] * gridSize * 1.2 - bs * 0.0 else: y = pos[1] * gridSize * 1.2 + bs * 0.2 ctrl.setSize(x, y, gridSize, gridSize) @@ -408,6 +427,9 @@ class glButton(glGuiControl): def setProgressBar(self, value): self._progressBar = value + def getProgressBar(self): + return self._progressBar + def setBottomText(self, value): self._altTooltip = value @@ -474,29 +496,33 @@ class glButton(glGuiControl): glPopMatrix() progress = self._progressBar if progress is not None: - glColor4ub(255,255,255,192) - opengl.glDrawTexturedQuad(pos[0]-bs/2, pos[1]+bs/2, bs, bs / 4, 0) + glColor4ub(60,60,60,255) + opengl.glDrawQuad(pos[0]-bs/2, pos[1]+bs/2, bs, bs / 4) glColor4ub(255,255,255,255) - opengl.glDrawTexturedQuad(pos[0]-bs/2, pos[1]+bs/2, bs * progress, bs / 4, 0) + opengl.glDrawQuad(pos[0]-bs/2+2, pos[1]+bs/2+2, (bs - 5) * progress + 1, bs / 4 - 4) elif len(self._altTooltip) > 0: glPushMatrix() glTranslatef(pos[0], pos[1], 0) - glTranslatef(0.6*bs*scale, 0, 0) - - glPushMatrix() - glColor4ub(60,60,60,255) - glTranslatef(-1, -1, 0) - opengl.glDrawStringLeft(self._altTooltip) - glTranslatef(0, 2, 0) - opengl.glDrawStringLeft(self._altTooltip) - glTranslatef(2, 0, 0) - opengl.glDrawStringLeft(self._altTooltip) - glTranslatef(0, -2, 0) - opengl.glDrawStringLeft(self._altTooltip) - glPopMatrix() - - glColor4ub(255,255,255,255) - opengl.glDrawStringLeft(self._altTooltip) + glTranslatef(0, 0.6*bs, 0) + glTranslatef(0, 6, 0) + #glTranslatef(0.6*bs*scale, 0, 0) + + for line in self._altTooltip.split('\n'): + glPushMatrix() + glColor4ub(60,60,60,255) + glTranslatef(-1, -1, 0) + opengl.glDrawStringCenter(line) + glTranslatef(0, 2, 0) + opengl.glDrawStringCenter(line) + glTranslatef(2, 0, 0) + opengl.glDrawStringCenter(line) + glTranslatef(0, -2, 0) + opengl.glDrawStringCenter(line) + glPopMatrix() + + glColor4ub(255,255,255,255) + opengl.glDrawStringCenter(line) + glTranslatef(0, 18, 0) glPopMatrix() def _checkHit(self, x, y): @@ -684,7 +710,7 @@ class glNotification(glFrame): super(glNotification, self).__init__(parent, pos) glGuiLayoutGrid(self)._alignBottom = False self._label = glLabel(self, "Notification", (0, 0)) - self._buttonEject = glButton(self, 31, "Eject", (1, 0), self.onEject, 25) + self._buttonExtra = glButton(self, 31, "???", (1, 0), self.onExtraButton, 25) self._button = glButton(self, 30, "", (2, 0), self.onClose, 25) self._padding = glLabel(self, "", (0, 1)) self.setHidden(True) @@ -702,21 +728,20 @@ class glNotification(glFrame): self.updateLayout() super(glNotification, self).draw() - def message(self, text, ejectCallback = None): - if self._anim is not None: - self._anim = animation(self._base, self._anim.getPosition(), 25, 1) - else: - self._anim = animation(self._base, -20, 25, 1) + def message(self, text, extraButtonCallback = None, extraButtonIcon = None, extraButtonTooltip = None): + self._anim = animation(self._base, -20, 25, 1) self.setHidden(False) self._label.setLabel(text) - self._buttonEject.setHidden(ejectCallback is None) - self._ejectCallback = ejectCallback + self._buttonExtra.setHidden(extraButtonCallback is None) + self._buttonExtra._imageID = extraButtonIcon + self._buttonExtra._tooltip = extraButtonTooltip + self._extraButtonCallback = extraButtonCallback self._base._queueRefresh() self.updateLayout() - def onEject(self, button): + def onExtraButton(self, button): self.onClose(button) - self._ejectCallback() + self._extraButtonCallback() def onClose(self, button): if self._anim is not None: @@ -949,10 +974,12 @@ class glSlider(glGuiControl): def setValue(self, value): self._value = value - self._value = max(self._minValue, self._value) - self._value = min(self._maxValue, self._value) def getValue(self): + if self._value < self._minValue: + return self._minValue + if self._value > self._maxValue: + return self._maxValue return self._value def setRange(self, minValue, maxValue): @@ -960,8 +987,6 @@ class glSlider(glGuiControl): maxValue = minValue self._minValue = minValue self._maxValue = maxValue - self._value = max(minValue, self._value) - self._value = min(maxValue, self._value) def getMinValue(self): return self._minValue @@ -1001,21 +1026,23 @@ class glSlider(glGuiControl): glVertex2f( w/2, h/2) glEnd() scrollLength = h - w + if self._maxValue-self._minValue != 0: + valueNormalized = ((self.getValue()-self._minValue)/(self._maxValue-self._minValue)) + else: + valueNormalized = 0 glTranslate(0.0,scrollLength/2,0) - if self._focus: + if True: # self._focus: glColor4ub(0,0,0,255) glPushMatrix() glTranslate(-w/2,opengl.glGetStringSize(str(self._minValue))[1]/2,0) opengl.glDrawStringRight(str(self._minValue)) glTranslate(0,-scrollLength,0) opengl.glDrawStringRight(str(self._maxValue)) - if self._maxValue-self._minValue > 0: - glTranslate(w,scrollLength-scrollLength*((self._value-self._minValue)/(self._maxValue-self._minValue)),0) - opengl.glDrawStringLeft(str(self._value)) + glTranslate(w,scrollLength-scrollLength*valueNormalized,0) + opengl.glDrawStringLeft(str(self.getValue())) glPopMatrix() glColor4ub(255,255,255,240) - if self._maxValue - self._minValue != 0: - glTranslate(0.0,-scrollLength*((self._value-self._minValue)/(self._maxValue-self._minValue)),0) + glTranslate(0.0,-scrollLength*valueNormalized,0) glBegin(GL_QUADS) glVertex2f( w/2,-w/2) glVertex2f(-w/2,-w/2)