Changeset 8810:087e56bd1091 in orange


Ignore:
Timestamp:
08/26/11 18:51:23 (3 years ago)
Author:
matejd <matejd@…>
Branch:
default
Convert:
8f54ef18ac4629b2d1ecf30bff8d620b6b226612
Message:

Added dark theme option to all 3d widgets; noticeable sphereviz performance optimization; refactored PlotTheme into its own module

Location:
orange/OrangeWidgets
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Visualize Qt/OWLinProj3DPlot.py

    r8809 r8810  
    1515 
    1616        self.camera_fov = 50. 
     17        self.camera_in_center = False 
    1718        self.show_axes = self.show_chassis = self.show_grid = False 
    1819 
     
    163164 
    164165                glDepthMask(GL_FALSE) 
    165                 glColor4f(0, 0, 0, 1) 
     166                self.qglColor(self._theme.axis_values_color) 
    166167                self.renderText(x*1.2, y*1.2, z*1.2, label) 
    167168 
     169                self.qglColor(self._theme.axis_color) 
    168170                glBegin(GL_LINES) 
    169171                glVertex3f(0, 0, 0) 
     
    176178            glEnable(GL_DEPTH_TEST) 
    177179            if self._arrow_lines: 
    178                 glLineWidth(2) 
     180                glLineWidth(3) 
    179181                for x, y, z, value, factor, color in self._arrow_lines: 
    180182                    glColor3f(*color) 
     
    184186                    glEnd() 
    185187 
    186                     glColor3f(0, 0, 0) 
     188                    self.qglColor(self._theme.axis_color) 
    187189                    # TODO: discrete 
    188190                    self.renderText(x,y,z, ('%f' % (value if self.tooltipValue == 0 else factor)).rstrip('0').rstrip('.'), 
  • orange/OrangeWidgets/Visualize Qt/OWLinProjQt.py

    r8777 r8810  
    1717import orngVisFuncts, OWColorPalette 
    1818import orngVizRank 
     19from plot.owtheme import PlotTheme 
     20 
     21class LinProjTheme(PlotTheme): 
     22    def __init__(self): 
     23        super(LinProjTheme, self).__init__() 
     24 
     25class LightTheme(LinProjTheme): 
     26    pass 
     27 
     28class DarkTheme(LinProjTheme): 
     29    def __init__(self): 
     30        super(DarkTheme, self).__init__() 
     31        self.labels_color = QColor(230, 230, 230, 255) 
     32        self.axis_values_color = QColor(170, 170, 170, 255) 
     33        self.axis_color = QColor(230, 230, 230, 255) 
     34        self.background_color = QColor(0, 0, 0, 255) 
    1935 
    2036########################################################################################### 
     
    187203        OWGUI.checkBox(box, self, 'graph.useDifferentColors', 'Use different colors', callback = self.updateGraph, tooltip = "Show different class values using different colors") 
    188204 
    189         if "sphereviz" in name_lower: 
     205        if "3d" in name_lower: 
     206            self.dark_theme = False 
     207            OWGUI.checkBox(box, self, 'dark_theme', 'Dark theme', callback=self.on_theme_change) 
    190208            OWGUI.checkBox(box, self, 'graph.camera_in_center', 'Camera in center', callback = self.updateGraph, tooltip = "Look at the data from the center") 
    191  
    192         if "3d" in name_lower: 
    193209            OWGUI.checkBox(box, self, 'graph.use_2d_symbols', '2D symbols', callback = self.updateGraph, tooltip = "Use 2D symbols") 
    194210        else: 
     
    398414        OWVisWidget.hideEvent(self, ev) 
    399415         
    400  
    401416    def sendReport(self): 
    402417        self.reportImage(self.graph.saveToFileDirect, QSize(500, 500)) 
     418 
     419    def on_theme_change(self): 
     420        if self.dark_theme: 
     421            self.graph.theme = DarkTheme() 
     422        else: 
     423            self.graph.theme = LightTheme() 
     424 
    403425         
    404426#test widget appearance 
  • orange/OrangeWidgets/Visualize Qt/OWScatterPlot3D.py

    r8805 r8810  
    2626    def __init__(self): 
    2727        super(ScatterPlotTheme, self).__init__() 
    28         self.grid_color = [0.8, 0.8, 0.8, 1.] 
     28        self.grid_color = QColor(200, 200, 200, 255) 
    2929 
    3030class LightTheme(ScatterPlotTheme): 
     
    3434    def __init__(self): 
    3535        super(DarkTheme, self).__init__() 
    36         self.grid_color = [0.3, 0.3, 0.3, 1.] 
    37         self.labels_color = [0.9, 0.9, 0.9, 1.] 
    38         self.helpers_color = [0.9, 0.9, 0.9, 1.] 
    39         self.axis_values_color = [0.7, 0.7, 0.7, 1.] 
    40         self.axis_color = [0.8, 0.8, 0.8, 1.] 
    41         self.background_color = [0., 0., 0., 1.] 
     36        self.grid_color = QColor(80, 80, 80, 255) 
     37        self.labels_color = QColor(230, 230, 230, 255) 
     38        self.helpers_color = QColor(230, 230, 230, 255) 
     39        self.axis_values_color = QColor(180, 180, 180, 255) 
     40        self.axis_color = QColor(200, 200, 200, 255) 
     41        self.background_color = QColor(0, 0, 0, 255) 
    4242 
    4343class ScatterPlot(OWPlot3D, orngScaleScatterPlotData): 
     
    218218 
    219219    def draw_chassis(self): 
    220         glColor4f(*self._theme.axis_values_color) 
     220        self.qglColor(self._theme.axis_values_color) 
    221221        glEnable(GL_LINE_STIPPLE) 
    222222        glLineStipple(1, 0x00FF) 
     
    250250 
    251251        def _draw_grid(axis0, axis1, normal0, normal1, i, j): 
    252             glColor4f(*self._theme.grid_color) 
     252            self.qglColor(self._theme.grid_color) 
    253253            for axis, normal, coord_index in zip([axis0, axis1], [normal0, normal1], [i, j]): 
    254254                start, end = axis.copy() 
  • orange/OrangeWidgets/Visualize Qt/OWSphereviz3D.py

    r8771 r8810  
    1818        OWLinProj3DPlot.__init__(self, widget, parent, name) 
    1919 
    20         self.camera_in_center = False 
     20    def _build_anchor_grid(self): 
     21        lines = [] 
     22        num_parts = 30 
     23        anchors = array([a[:3] for a in self.anchor_data]) 
     24        for anchor in self.anchor_data: 
     25            a0 = array(anchor[:3]) 
     26            neighbours = anchors.copy() 
     27            neighbours = [(((n-a0)**2).sum(), n)  for n in neighbours] 
     28            neighbours.sort(key=lambda e: e[0]) 
     29            for i in range(1, min(len(anchors), 4)):  
     30                difference = neighbours[i][1]-a0 
     31                for j in range(num_parts): 
     32                    lines.extend(normalize(a0 + difference*j/float(num_parts))) 
     33                    lines.extend(normalize(a0 + difference*(j+1)/float(num_parts))) 
     34 
     35        self.grid_vao_id = GLuint(0) 
     36        glGenVertexArrays(1, self.grid_vao_id) 
     37        glBindVertexArray(self.grid_vao_id) 
     38 
     39        vertex_buffer_id = glGenBuffers(1) 
     40        glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id) 
     41        glBufferData(GL_ARRAY_BUFFER, numpy.array(lines, numpy.float32), GL_STATIC_DRAW) 
     42 
     43        vertex_size = 3*4 
     44        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(0)) 
     45        glEnableVertexAttribArray(0) 
     46        glBindVertexArray(0) 
     47        glBindBuffer(GL_ARRAY_BUFFER, 0) 
     48 
     49        self.grid_vao_id.num_vertices = len(lines) / 3 
     50 
     51    def updateData(self, labels=None, setAnchors=0, **args): 
     52        OWLinProj3DPlot.updateData(self, labels, setAnchors, **args) 
     53 
     54        if self.anchor_data: 
     55            self._build_anchor_grid() 
     56 
     57        self.updateGL() 
    2158 
    2259    def setData(self, data, subsetData=None, **args): 
    2360        OWLinProj3DPlot.setData(self, data, subsetData, **args) 
    2461 
     62        # No need to generate backgroud grid sphere geometry more than once 
    2563        if hasattr(self, 'sphere_vao_id'): 
    2664            return 
    2765 
    28         sphere_data = parse_obj('sphere_hq.obj') 
    29         vertices = [] 
    30         for v0, v1, v2, n0, n1, n2 in sphere_data: 
    31             vertices.extend([v0[0],v0[1],v0[2], n0[0],n0[1],n0[2], 
    32                              v1[0],v1[1],v1[2], n1[0],n1[1],n1[2], 
    33                              v2[0],v2[1],v2[2], n2[0],n2[1],n2[2]]) 
     66        lines = [] 
     67        num_parts = 30 
     68        num_horizontal_rings = 20 
     69        num_vertical_rings = 24 
     70        r = 1. 
     71 
     72        for i in range(num_horizontal_rings): 
     73            z_offset = float(i) * 2 / num_horizontal_rings - 1. 
     74            r = (1. - z_offset**2)**0.5 
     75            for j in range(num_parts): 
     76                angle_z_0 = float(j) * 2 * pi / num_parts 
     77                angle_z_1 = float(j+1) * 2 * pi / num_parts 
     78                lines.extend([sin(angle_z_0)*r, z_offset, cos(angle_z_0)*r, 
     79                              sin(angle_z_1)*r, z_offset, cos(angle_z_1)*r]) 
     80 
     81        for i in range(num_vertical_rings): 
     82            r = 1. 
     83            phi = 2 * i * pi / num_vertical_rings 
     84            for j in range(num_parts): 
     85                theta_0 = (j) * pi / num_parts 
     86                theta_1 = (j+1) * pi / num_parts 
     87                lines.extend([sin(theta_0)*cos(phi)*r, cos(theta_0)*r, sin(theta_0)*sin(phi)*r, 
     88                              sin(theta_1)*cos(phi)*r, cos(theta_1)*r, sin(theta_1)*sin(phi)*r]) 
    3489 
    3590        self.sphere_vao_id = GLuint(0) 
     
    3994        vertex_buffer_id = glGenBuffers(1) 
    4095        glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id) 
    41         glBufferData(GL_ARRAY_BUFFER, numpy.array(vertices, 'f'), GL_STATIC_DRAW) 
    42  
    43         vertex_size = (3+3)*4 
     96        glBufferData(GL_ARRAY_BUFFER, numpy.array(lines, numpy.float32), GL_STATIC_DRAW) 
     97 
     98        vertex_size = 3*4 
    4499        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(0)) 
    45         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertex_size, c_void_p(3*4)) 
    46100        glEnableVertexAttribArray(0) 
    47         glEnableVertexAttribArray(1) 
    48  
    49101        glBindVertexArray(0) 
    50102        glBindBuffer(GL_ARRAY_BUFFER, 0) 
    51103 
    52         self.sphere_vao_id.num_vertices = len(vertices) / (vertex_size / 4) 
    53  
    54         # Geometry shader-based wireframe rendering 
    55         # (http://cgg-journal.com/2008-2/06/index.html) 
    56         self.sphere_shader = QtOpenGL.QGLShaderProgram() 
    57         geometry_shader_source = '''#version 150 
    58             layout(triangles) in; 
    59             layout(triangle_strip, max_vertices=3) out; 
     104        self.sphere_vao_id.num_vertices = len(lines) / 3 
     105 
     106        vertex_shader_source = '''#version 150 
     107            in vec3 position; 
     108            out float transparency; 
    60109 
    61110            uniform mat4 projection; 
    62111            uniform mat4 modelview; 
    63112            uniform vec3 cam_position; 
    64             out float transparency; 
    65  
    66             uniform vec2 win_scale; 
    67             noperspective out vec3 dist; 
    68113 
    69114            void main(void) 
    70115            { 
    71                 vec4 pos_in0 = projection * modelview * gl_PositionIn[0]; 
    72                 vec4 pos_in1 = projection * modelview * gl_PositionIn[1]; 
    73                 vec4 pos_in2 = projection * modelview * gl_PositionIn[2]; 
    74                 vec2 p0 = win_scale * pos_in0.xy / pos_in0.w; 
    75                 vec2 p1 = win_scale * pos_in1.xy / pos_in1.w; 
    76                 vec2 p2 = win_scale * pos_in2.xy / pos_in2.w; 
    77  
    78                 vec2 v0 = p2-p1; 
    79                 vec2 v1 = p2-p0; 
    80                 vec2 v2 = p1-p0; 
    81                 float area = abs(v1.x*v2.y - v1.y * v2.x); 
    82  
    83                 dist = vec3(area / length(v0), 0., 0.); 
    84                 gl_Position = pos_in0; 
    85                 transparency = clamp(dot(normalize(cam_position-gl_PositionIn[0].xyz), normalize(gl_PositionIn[0].xyz)), 0., 1.); 
    86                 EmitVertex(); 
    87  
    88                 dist = vec3(0., area / length(v1), 0.); 
    89                 gl_Position = pos_in1; 
    90                 transparency = clamp(dot(normalize(cam_position-gl_PositionIn[1].xyz), normalize(gl_PositionIn[1].xyz)), 0., 1.); 
    91                 EmitVertex(); 
    92  
    93                 dist = vec3(0., 0., area / length(v2)); 
    94                 gl_Position = pos_in2; 
    95                 transparency = clamp(dot(normalize(cam_position-gl_PositionIn[2].xyz), normalize(gl_PositionIn[2].xyz)), 0., 1.); 
    96                 EmitVertex(); 
    97  
    98                 EndPrimitive(); 
     116                transparency = clamp(dot(normalize(cam_position-position), normalize(position)), 0., 1.); 
     117                gl_Position = projection * modelview * vec4(position, 1.); 
    99118            } 
    100         ''' 
    101  
    102         vertex_shader_source = '''#version 150 
    103             attribute vec3 position; 
    104             attribute vec3 normal; 
     119            ''' 
     120 
     121        fragment_shader_source = '''#version 150 
     122            in float transparency; 
     123            uniform bool invert_transparency; 
    105124 
    106125            void main(void) 
    107126            { 
    108                 gl_Position = vec4(position, 1.); 
     127                gl_FragColor = vec4(0.5, 0.5, 0.5, 1. - transparency - 0.6); 
     128                if (invert_transparency) 
     129                    gl_FragColor.a = transparency; 
    109130            } 
    110131            ''' 
    111132 
    112         fragment_shader_source = '''#version 150 
    113             in float transparency; 
    114             noperspective in vec3 dist; 
    115  
    116             uniform bool invert_transparency; 
    117             const vec4 wire_color = vec4(0.5, 0.5, 0.5, 0.5); 
    118             const vec4 fill_color = vec4(1., 1., 1., 0.5); 
     133        self.sphere_shader = QtOpenGL.QGLShaderProgram() 
     134        self.sphere_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Vertex, vertex_shader_source) 
     135        self.sphere_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Fragment, fragment_shader_source) 
     136 
     137        self.sphere_shader.bindAttributeLocation('position', 0) 
     138 
     139        if not self.sphere_shader.link(): 
     140            print('Failed to link sphere shader!') 
     141 
     142        # Another dummy shader (anchor grid) 
     143        vertex_shader_source = '''#version 150 
     144            in vec3 position; 
     145 
     146            uniform mat4 projection; 
     147            uniform mat4 modelview; 
    119148 
    120149            void main(void) 
    121150            { 
    122                 float d = min(dist[0], min(dist[1], dist[2])); 
    123                 gl_FragColor = mix(wire_color, fill_color, 1. - exp2(-1*d*d)); 
    124                 if (invert_transparency) 
    125                     gl_FragColor.a = transparency; 
    126                 else 
    127                     gl_FragColor.a = 1. - transparency - 0.6; 
     151                gl_Position = projection * modelview * vec4(position, 1.); 
    128152            } 
    129153            ''' 
    130154 
    131         self.sphere_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Geometry, geometry_shader_source) 
    132         self.sphere_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Vertex, vertex_shader_source) 
    133         self.sphere_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Fragment, fragment_shader_source) 
    134  
    135         self.sphere_shader.bindAttributeLocation('position', 0) 
    136         self.sphere_shader.bindAttributeLocation('normal',   1) 
    137  
    138         if not self.sphere_shader.link(): 
    139             print('Failed to link sphere shader!') 
     155        fragment_shader_source = '''#version 150 
     156            uniform vec4 color; 
     157 
     158            void main(void) 
     159            { 
     160                gl_FragColor = color; 
     161            } 
     162            ''' 
     163 
     164        self.grid_shader = QtOpenGL.QGLShaderProgram() 
     165        self.grid_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Vertex, vertex_shader_source) 
     166        self.grid_shader.addShaderFromSourceCode(QtOpenGL.QGLShader.Fragment, fragment_shader_source) 
     167 
     168        self.grid_shader.bindAttributeLocation('position', 0) 
     169 
     170        if not self.grid_shader.link(): 
     171            print('Failed to link grid shader!') 
    140172 
    141173        self.before_draw_callback = lambda: self.before_draw() 
     
    167199        self.draw_sphere() 
    168200 
     201        # Qt text rendering classes still use deprecated OpenGL functionality 
    169202        glEnable(GL_DEPTH_TEST) 
    170203        glDisable(GL_BLEND) 
     204        glMatrixMode(GL_PROJECTION) 
     205        glLoadIdentity() 
     206        glMultMatrixd(numpy.array(self.projection.data(), dtype=float)) 
     207        glMatrixMode(GL_MODELVIEW) 
     208        glLoadIdentity() 
     209        glMultMatrixd(numpy.array(self.modelview.data(), dtype=float)) 
    171210 
    172211        if self.showAnchors: 
     
    199238                self.cone_shader.release() 
    200239 
    201                 glColor4f(0, 0, 0, 1) 
     240                self.qglColor(self._theme.axis_values_color) 
    202241                self.renderText(x*1.2, y*1.2, z*1.2, label) 
    203242 
    204             num_parts = 30 
    205             anchors = array([a[:3] for a in self.anchor_data]) 
    206             for anchor in self.anchor_data: 
    207                 a0 = array(anchor[:3]) 
    208                 neighbours = anchors.copy() 
    209                 neighbours = [(((n-a0)**2).sum(), n)  for n in neighbours] 
    210                 neighbours.sort(key=lambda e: e[0]) 
    211                 for i in range(1, min(len(anchors), 4)):  
    212                     difference = neighbours[i][1]-a0 
    213                     glBegin(GL_LINES) 
    214                     for j in range(num_parts): 
    215                         glVertex3f(*normalize(a0 + difference*j/float(num_parts))) 
    216                         glVertex3f(*normalize(a0 + difference*(j+1)/float(num_parts))) 
    217                     glEnd(GL_LINES) 
     243            if self.anchor_data and not hasattr(self, 'grid_vao_id'): 
     244                self._build_anchor_grid() 
     245 
     246            # Draw grid between anchors 
     247            self.grid_shader.bind() 
     248            self.grid_shader.setUniformValue('projection', self.projection) 
     249            self.grid_shader.setUniformValue('modelview', self.modelview) 
     250            self.grid_shader.setUniformValue('color', self._theme.axis_color) 
     251            glBindVertexArray(self.grid_vao_id) 
     252 
     253            glDrawArrays(GL_LINES, 0, self.grid_vao_id.num_vertices) 
     254 
     255            glBindVertexArray(0) 
     256            self.grid_shader.release() 
    218257 
    219258        self._draw_value_lines() 
     
    225264 
    226265        self.sphere_shader.bind() 
    227         self.sphere_shader.setUniformValue('win_scale', self.width(), self.height()) 
    228266        self.sphere_shader.setUniformValue('projection', self.projection) 
    229267        self.sphere_shader.setUniformValue('modelview', self.modelview) 
     
    232270        glBindVertexArray(self.sphere_vao_id) 
    233271 
    234         glEnable(GL_CULL_FACE) 
    235         glCullFace(GL_FRONT) 
    236         glDrawArrays(GL_TRIANGLES, 0, self.sphere_vao_id.num_vertices) 
    237         glCullFace(GL_BACK) 
    238         glDrawArrays(GL_TRIANGLES, 0, self.sphere_vao_id.num_vertices) 
    239         glDisable(GL_CULL_FACE) 
     272        glDrawArrays(GL_LINES, 0, self.sphere_vao_id.num_vertices) 
    240273 
    241274        glBindVertexArray(0) 
    242275        self.sphere_shader.release() 
    243  
    244         glMatrixMode(GL_PROJECTION) 
    245         glLoadIdentity() 
    246         glMultMatrixd(numpy.array(self.projection.data(), dtype=float)) 
    247         glMatrixMode(GL_MODELVIEW) 
    248         glLoadIdentity() 
    249         glMultMatrixd(numpy.array(self.modelview.data(), dtype=float)) 
    250  
    251         # Two more ways to visualize sphere: 
    252         #glColor3f(0., 0., 0.) 
    253         #glDisable(GL_BLEND) 
    254         #num_rings = 24 
    255         #num_parts = 30 
    256         #r = 1. 
    257         #glBegin(GL_LINES) 
    258         #for i in range(num_rings): 
    259             #z_offset = float(i) * 2 / num_rings - 1. 
    260             #r = (1. - z_offset**2)**0.5 
    261             #for j in range(num_parts): 
    262                 #angle_z_0 = float(j) * 2 * pi / num_parts 
    263                 #angle_z_1 = float(j+1) * 2 * pi / num_parts 
    264                 #glVertex3f(sin(angle_z_0)*r, cos(angle_z_0)*r, z_offset) 
    265                 #glVertex3f(sin(angle_z_1)*r, cos(angle_z_1)*r, z_offset) 
    266             #for j in range(num_parts): 
    267                 #angle_z_0 = float(j) * 2 * pi / num_parts 
    268                 #angle_z_1 = float(j+1) * 2 * pi / num_parts 
    269                 #glVertex3f(sin(angle_z_0)*r, z_offset, cos(angle_z_0)*r) 
    270                 #glVertex3f(sin(angle_z_1)*r, z_offset, cos(angle_z_1)*r) 
    271         #glEnd() 
    272  
    273         #for i in range(num_rings): 
    274             #angle_y = float(i) * 2 * pi / num_rings 
    275             #glBegin(GL_LINES) 
    276             #for j in range(num_parts): 
    277                 #angle_x_0 = float(j) * 2 * pi / num_parts 
    278                 #angle_x_1 = float(j+1) * 2 * pi / num_parts 
    279                 #glVertex3f(r * sin(angle_x_0) * cos(angle_y), 
    280                            #r * cos(angle_x_0), 
    281                            #r * sin(angle_x_0) * sin(angle_y)) 
    282                 #glVertex3f(r * sin(angle_x_1) * cos(angle_y), 
    283                            #r * cos(angle_x_1), 
    284                            #r * sin(angle_x_1) * sin(angle_y)) 
    285             #glEnd() 
    286276 
    287277    def mouseMoveEvent(self, event): 
  • orange/OrangeWidgets/plot/owplot3d.py

    r8803 r8810  
    2626import orange 
    2727import orangeqt 
     28from owtheme import PlotTheme 
    2829 
    2930import OpenGL 
     
    4243 
    4344try: 
     45    from itertools import chain 
    4446    from itertools import izip as zip 
    45     from itertools import chain 
    4647except: 
    4748    pass 
     
    218219        v1, v2 = self.first_vertex, self.current_vertex 
    219220        glLineWidth(1) 
    220         glColor4f(*self.plot.theme.helpers_color) 
     221        self.plot.qglColor(self.plot._theme.helpers_color) 
    221222        draw_line(v1[0], v1[1], v1[0], v2[1]) 
    222223        draw_line(v1[0], v2[1], v2[0], v2[1]) 
     
    291292    def draw(self): 
    292293        glLineWidth(1) 
    293         glColor4f(*self.plot.theme.helpers_color) 
     294        self.plot.qglColor(self.plot._theme.helpers_color) 
    294295        if len(self.vertices) == 1: 
    295296            v1, v2 = self.vertices[0], self.current_vertex 
     
    315316                          vi[0], vi[1], 
    316317                          vj[0], vj[1]) 
    317  
    318 class PlotTheme(object): 
    319     def __init__(self): 
    320         self.labels_font = QFont('Helvetice', 8) 
    321         self.helper_font = self.labels_font 
    322         self.helpers_color = [0., 0., 0., 1.]        # Color used for helping arrows when scaling. 
    323         self.background_color = [1., 1., 1., 1.]     # Color in the background. 
    324         self.axis_title_font = QFont('Helvetica', 10, QFont.Bold) 
    325         self.axis_font = QFont('Helvetica', 9) 
    326         self.labels_color = [0., 0., 0., 1.] 
    327         self.axis_color = [0.1, 0.1, 0.1, 1.] 
    328         self.axis_values_color = [0.1, 0.1, 0.1, 1.] 
    329318 
    330319class OWPlot3D(orangeqt.Plot3D): 
     
    623612    def paintGL(self): 
    624613        glViewport(0, 0, self.width(), self.height()) 
    625         glClearColor(*self._theme.background_color) 
     614        self.qglClearColor(self._theme.background_color) 
     615 
    626616        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
    627617 
     
    764754        glMultMatrixd(array(self.modelview.data(), dtype=float)) 
    765755 
    766         glColor4f(*self._theme.labels_color) 
     756        self.qglColor(self._theme.labels_color) 
    767757        for example in self.data.transpose(): 
    768758            x = example[self.x_index] 
     
    787777            x, y = self.mouse_pos.x(), self.mouse_pos.y() 
    788778            #TODO: replace with an image 
    789             glColor4f(*self._theme.helpers_color) 
     779            self.qglColor(self._theme.helpers_color) 
    790780            draw_triangle(x-5, y-30, x+5, y-30, x, y-40) 
    791781            draw_line(x, y, x, y-30) 
     
    845835 
    846836        def draw_axis(line): 
    847             glColor4f(*self._theme.axis_color) 
     837            self.qglColor(self._theme.axis_color) 
    848838            glLineWidth(2) 
    849839            glBegin(GL_LINES) 
     
    872862 
    873863        def draw_values(axis, coord_index, normal, axis_labels): 
    874             glColor4f(*self._theme.axis_values_color) 
     864            self.qglColor(self._theme.axis_values_color) 
    875865            glLineWidth(1) 
    876866            if axis_labels != None: 
Note: See TracChangeset for help on using the changeset viewer.