Exemple #1
0
    def __init__(self):
        gtk.Window.__init__(self)
        self.set_title("Legend: Empty")
        self.set_resizable(True)
        self.set_default_size(300, 300)

        self.layer = None
        self.teardown_id = None
        self.changed_id = None
        self.resizing = False
        self.resize_count = 0

        self.viewarea = gview.GvViewArea()
        back_color = pref('legend-background-color', white)
        self.viewarea.set_background_color(color_string_to_tuple(back_color))

        self.shapes = gview.GvShapes()
        self.shapes.set_name('Legend shapes')
        self.vlayer = gview.GvShapesLayer(self.shapes)
        self.vlayer.set_name('Legend layer')
        self.viewarea.add_layer(self.vlayer)
        self.add(self.viewarea)

        self.connect('delete-event', self.close)
        self.show_all()

        self.changing_view_state = False
        self.viewarea.connect('view-state-changed', self.view_state_cb)
        if 'CIETMAP_HOME' in os.environ:
            set_help_topic(self, _('cm-help-legend'))
Exemple #2
0
    def __init__(self):
        GtkWindow.__init__(self)

        self.layer = None
        self.teardown_id = None
        self.changed_id = None
        self.resizing = FALSE
        self.resize_count = 0

        self.set_title('Legend: Empty')
        self.set_policy(TRUE, TRUE, FALSE)
        self.set_usize(300, 300)
        self.viewarea = gview.GvViewArea()
        back_color = gview.get_preference('legend-background-color')
        if back_color is None:
            back_color = (1.0, 1.0, 1.0, 1.0)
        else:
            back_color = color_string_to_tuple(back_color)

        self.viewarea.set_background_color(back_color)
        self.shapes = gview.GvShapes()
        self.vlayer = gview.GvShapesLayer(self.shapes)
        self.viewarea.add_layer(self.vlayer)
        self.add(self.viewarea)

        self.connect('delete-event', self.close)
        self.show_all()

        self.viewarea.fit_extents(0, self.viewarea.get_height(),
                                  self.viewarea.get_width(),
                                  -self.viewarea.get_height())

        self.changing_view_state = 0
        self.viewarea.connect('view-state-changed', self.view_state_cb)
Exemple #3
0
    def __init__(self):
        GtkWindow.__init__(self)

        self.layer = None
        self.teardown_id = None
        self.changed_id = None
        self.resizing = FALSE
        self.resize_count = 0
        
        self.set_title('Legend: Empty')
        self.set_policy(TRUE,TRUE,FALSE)
        self.set_usize(300, 300)
        self.viewarea = gview.GvViewArea()
        back_color = gview.get_preference('legend-background-color')
        if back_color is None:
            back_color = (1.0, 1.0, 1.0, 1.0 )
        else:
            back_color = color_string_to_tuple(back_color)

        self.viewarea.set_background_color( back_color )
        self.shapes = gview.GvShapes()
        self.vlayer = gview.GvShapesLayer(self.shapes)
        self.viewarea.add_layer( self.vlayer )
        self.add( self.viewarea )

        self.connect( 'delete-event', self.close )
        self.show_all()

        self.viewarea.fit_extents(0,
                                  self.viewarea.get_height(),
                                  self.viewarea.get_width(),
                                  -self.viewarea.get_height() )

        self.changing_view_state = 0
        self.viewarea.connect('view-state-changed', self.view_state_cb )
Exemple #4
0
    def prepare_legend(self):
        if self.resizing:
            return

        class_cn = self.layer.get_property('Class_sn')
        if class_cn:
            self.Class_sn = int(class_cn)

        #remove any existing shapes
        self.shapes.delete_shapes(range(len(self.shapes)))
        # get preferences
        samp_x_size = pref('legend-sample-x-size', 20)
        samp_y_size = pref('legend-sample-y-size', 20)

        title_font = pref('legend-title-font','Serif 20')
        title_font_color = pref('legend-title-font-color', black)
        title_ogr_color = gv_to_ogr_color(color_string_to_tuple(title_font_color))

        label_font = pref('legend-label-font','Serif 14')
        label_font_color = pref('legend-label-font-color', black)
        label_ogr_color = gv_to_ogr_color(color_string_to_tuple(label_font_color))

        # utility layout for measuring text w/h
        layout = pango.Layout(self.viewarea.get_pango_context())

        try:
            font = pango.FontDescription(title_font)
        except:
            font = pango.FontDescription('Serif 20')
        layout.set_font_description(font)

        #handle multi-line text for the title.
        lines = self.cls.title.split('\\n')

        layout.set_text(self.cls.title.replace('\\n', '\n'))
        title_width, title_height = layout.get_pixel_size()
        h = title_height/len(lines)

        x_offset = 10  #start title 10 pixels in from left edge
        col_offset = 30 #space columns apart
        y_offset = 35  #start title 35 pixels down from top edge
        max_height = 0
        title_width += x_offset + 10
        title_height += y_offset + 10

        #handle large fonts in the sample text
        try:
            font = pango.FontDescription(label_font)
        except:
            # get a default font if preferred one
            # can't be loaded.
            font = pango.FontDescription('Serif 14')
        layout.set_font_description(font)

        layout.set_text(self.cls.name[0])
        w,h = layout.get_pixel_size()
        samp_offset = max(samp_y_size, h) + 10

        cols = int(self.cls.count / 8)
        samps = min(8, self.cls.count)

        samp_height = samps * (samp_offset) + 10
        samp_width = x_offset

        for i in range(cols + 1):
            idx = 8 * i
            col_width = 0
            while idx < self.cls.count and idx < 8 * (i + 1):
                name = self.cls.name[idx]
                layout.set_text(name)
                width = samp_x_size + 20 + layout.get_pixel_size()[0]
                col_width = max(col_width, width)
                idx += 1
            samp_width += (col_width + col_offset)
        samp_width += 10
        total_width = max(title_width, samp_width)
        total_height = title_height + samp_height

        #resize the window appropriately
        self.resizing = True

        x,y,width,height,bpp = self.window.get_geometry()
        if width < total_width or height < total_height:
            self.resize_count += 1
            if self.resize_count < 2:
                self.set_size_request(total_width, total_height)

        self.resizing = False

        for line in lines:
            samp_text = gview.GvShape()
            samp_text.add_node(x_offset, y_offset)
            ogrfs = 'LABEL(c:%s,f:"%s",t:"%s")' % (title_ogr_color, title_font, line)
            samp_text.set_property('_gv_ogrfs', ogrfs)

            self.shapes.append(samp_text)
            y_offset += h

        txt = _('Legend')
        line = lines[0]
        if len(line) > 6 and line[:6] != txt and line[:6] != 'legend':
            self.set_title( '%s: %s...' % (txt, line) )
        else:
            self.set_title(line + '...')

        y_offset += 10
        title_offset = y_offset

        max_width = 0
        max_height = 0

        for class_id in range(self.cls.count):
            color = self.cls.get_color(class_id)
            symbol = self.cls.get_symbol(class_id)
            scale = self.cls.get_scale(class_id)
            name = self.cls.name[class_id]
            if symbol:
                samp = gview.GvShape(type=gview.GVSHAPE_POINT)
                samp.set_node(x_offset+samp_x_size/2, y_offset+samp_y_size/2)
                ogrfs_color = gv_to_ogr_color(color)
                ogrfs = 'SYMBOL(id:%s,c:%s,s:%s)' % (symbol, ogrfs_color, scale/2)
                samp.set_property('_gv_ogrfs', ogrfs)
            else:
                samp = gview.GvShape(type=gview.GVSHAPE_AREA)
                samp.add_node(x_offset, y_offset)
                samp.add_node(x_offset+samp_x_size, y_offset)
                samp.add_node(x_offset+samp_x_size, y_offset+samp_y_size)
                samp.add_node(x_offset, y_offset+samp_y_size)
                samp.add_node(x_offset, y_offset)

                color = '%f %f %f %f' % color
                samp.set_property('_gv_color', color)
                samp.set_property('_gv_fill_color', color)

            self.shapes.append(samp)

            samp_text = gview.GvShape()
            samp_text.add_node(x_offset+samp_x_size+10, y_offset+17)
            ogrfs = 'LABEL(c:%s,f:%s,t:%s)' % (label_ogr_color, label_font, name)
            samp_text.set_property('_gv_ogrfs', ogrfs)
            self.shapes.append(samp_text)

            layout.set_text(name)
            this_width = samp_x_size + 20 + layout.get_pixel_size()[0]
            if max_width < this_width:
                max_width = this_width

            y_offset += samp_offset
            if y_offset+samp_offset > self.viewarea.get_height():
                max_height = max(max_height, y_offset + samp_offset)
                y_offset = title_offset
                x_offset += (col_offset + max_width)
                max_width = 0

        self.vlayer.display_change()
Exemple #5
0
    def prepare_legend(self):

        if self.resizing:
            return

        if self.layer.get_property('Class_sn') is not None:
            self.Class_sn = int(self.layer.get_property('Class_sn'))

        #remove any existing shapes
        self.shapes.delete_shapes(range(len(self.shapes)))

        samp_x_size = gview.get_preference('legend-sample-x-size')
        if samp_x_size is None:
            samp_x_size = 20
        else:
            samp_x_size = int(samp_x_size)

        samp_y_size = gview.get_preference('legend-sample-y-size')
        if samp_y_size is None:
            samp_y_size = 20
        else:
            samp_y_size = int(samp_y_size)

        title_font = pgufont.XLFDFontSpec()
        font_spec = gview.get_preference('legend-title-font')
        if font_spec is None:
            title_font.set_font_part('Family', 'times')
            title_font.set_font_part('Pixel Size', '20')
        else:
            title_font.parse_font_spec(font_spec)

        title_font_color = gview.get_preference('legend-title-font-color')
        if title_font_color is None:
            title_font_color = (0.0, 0.0, 0.0, 1.0)
        else:
            title_font_color = color_string_to_tuple(title_font_color)
        title_ogr_color = gv_to_ogr_color(title_font_color)

        label_font = pgufont.XLFDFontSpec()
        font_spec = gview.get_preference('legend-label-font')
        if font_spec is None:
            label_font.set_font_part('Family', 'times')
            label_font.set_font_part('Pixel Size', '14')
        else:
            label_font.parse_font_spec(font_spec)

        label_font_color = gview.get_preference('legend-label-font-color')
        if label_font_color is None:
            label_font_color = (0.0, 0.0, 0.0, 1.0)
        else:
            label_font_color = color_string_to_tuple(label_font_color)
        label_ogr_color = gv_to_ogr_color(label_font_color)

        #handle large fonts in the sample text
        try:
            gdk_font = load_font(str(label_font))
        except:
            # get a default font if preferred one
            # can't be loaded.
            gdk_font = load_font('*')

        h = gdk_font.height("Wj")
        samp_offset = max(samp_y_size, h) + 10

        #handle multi-line text for the title.
        try:
            gdk_title_font = load_font(str(title_font))
        except:
            gdk_title_font = load_font('*')

        lines = string.split(self.classification.title, '\\n')

        x_offset = 10  #start title 10 pixels in from left edge
        col_offset = 30  #space columns apart
        y_offset = 35  #start title 35 pixels down from top edge
        title_width = 0
        max_height = 0

        #resize the window appropriately

        title_height = y_offset
        title_width = 0
        for idx in range(len(lines)):
            line = lines[idx]
            title_height = title_height + gdk_title_font.height(line)
            title_width = max(title_width, gdk_title_font.width(line))

        title_height = title_height + 10
        title_width = x_offset + title_width + 10

        cols = int(self.classification.count / 8)
        samps = min(8, self.classification.count)

        samp_height = samps * (samp_offset) + 10
        samp_width = x_offset

        for i in range(cols + 1):
            idx = 8 * i
            col_width = 0
            while idx < self.classification.count and idx < 8 * (i + 1):
                name = self.classification.name[idx]
                width = samp_x_size + 20 + gdk_font.width(name)
                col_width = max(col_width, width)
                idx = idx + 1
            samp_width = samp_width + col_width + col_offset
        samp_width = samp_width + 10

        total_width = max(title_width, samp_width)
        total_height = title_height + samp_height

        self.resizing = TRUE

        if (self.get_window().width < total_width) or \
           (self.get_window().height < total_height):
            self.resize_count = self.resize_count + 1
            if self.resize_count < 2:
                self.set_usize(total_width, total_height)

        self.resizing = FALSE

        for idx in range(len(lines)):
            line = lines[idx]
            w = gdk_title_font.width(line)
            h = gdk_title_font.height(line)
            title_width = max(title_width, w)

            samp_text = gview.GvShape()
            samp_text.add_node(x_offset, y_offset)
            samp_text.set_property( '_gv_ogrfs',
                                'LABEL(c:' + title_ogr_color + \
                                ',f:"' + str(title_font) + '",' \
                                + 't:"' + line + '")' )

            self.shapes.append(samp_text)
            y_offset = y_offset + h

        if ((len(lines[0]) > 6) and (lines[0][:6] != 'Legend')
                and (lines[0][:6] != 'legend')):
            self.set_title('Legend: ' + lines[0] + '...')
        else:
            self.set_title(lines[0] + '...')

        y_offset = y_offset + 10
        title_offset = y_offset

        max_width = 0
        max_height = 0

        for class_id in range(self.classification.count):
            color = self.classification.get_color(class_id)
            symbol = self.classification.get_symbol(class_id)
            scale = self.classification.get_scale(class_id)
            if symbol is not None:
                samp = gview.GvShape(type=gview.GVSHAPE_POINT)
                samp.add_node(x_offset + (samp_x_size / 2),
                              y_offset + (samp_y_size / 2))
                ogrfs_color = '#%02x%02x%02x%02x' % (
                    int(color[0] * 255.999), int(color[1] * 255.999),
                    int(color[2] * 255.999), int(color[3] * 255.999))
                ogrfs = "SYMBOL(id:%s,c:%s,s:%s)" % (symbol, ogrfs_color,
                                                     scale)
                samp.set_property("_gv_ogrfs", ogrfs)
            else:
                samp = gview.GvShape(type=gview.GVSHAPE_AREA)
                samp.add_node(x_offset, y_offset)
                samp.add_node(x_offset + samp_x_size, y_offset)
                samp.add_node(x_offset + samp_x_size, y_offset + samp_y_size)
                samp.add_node(x_offset, y_offset + samp_y_size)
                samp.add_node(x_offset, y_offset)

                color = '%f %f %f %f' % color

                samp.set_property('_gv_color', color)
                samp.set_property('_gv_fill_color', color)

            self.shapes.append(samp)

            name = self.classification.name[class_id]
            samp_text = gview.GvShape()
            samp_text.add_node(x_offset + samp_x_size + 10, y_offset + 17)
            font = str(label_font)
            samp_text.set_property( '_gv_ogrfs',
                      'LABEL(c:' + label_ogr_color + \
                      ',f:"'+font+'",t:"'+name+'")'  )
            self.shapes.append(samp_text)

            this_width = samp_x_size + 20 + gdk_font.width(name)
            if max_width < this_width:
                max_width = this_width

            y_offset = y_offset + samp_offset

            if y_offset + samp_offset > self.viewarea.get_height():
                max_height = max(max_height, y_offset + samp_offset)
                y_offset = title_offset
                x_offset = x_offset + col_offset + max_width
                max_width = 0

        self.vlayer.changed()
Exemple #6
0
    def prepare_legend(self):
        
        if self.resizing:
            return
      
        if self.layer.get_property('Class_sn') is not None:
            self.Class_sn = int(self.layer.get_property('Class_sn'))

        #remove any existing shapes
        self.shapes.delete_shapes(range(len(self.shapes)))

        samp_x_size = gview.get_preference('legend-sample-x-size')
        if samp_x_size is None:
            samp_x_size = 20
        else:
            samp_x_size = int(samp_x_size)

        samp_y_size = gview.get_preference('legend-sample-y-size')
        if samp_y_size is None:
            samp_y_size = 20
        else:
            samp_y_size = int(samp_y_size)


        title_font = pgufont.XLFDFontSpec()
        font_spec = gview.get_preference('legend-title-font')
        if font_spec is None:
            title_font.set_font_part('Family', 'times')
            title_font.set_font_part('Pixel Size', '20')
        else:
            title_font.parse_font_spec(font_spec)


        title_font_color = gview.get_preference('legend-title-font-color')
        if title_font_color is None:
            title_font_color =  (0.0, 0.0, 0.0, 1.0)
        else:
            title_font_color = color_string_to_tuple(title_font_color)
        title_ogr_color = gv_to_ogr_color(title_font_color)

        label_font = pgufont.XLFDFontSpec()
        font_spec = gview.get_preference('legend-label-font')
        if font_spec is None:
            label_font.set_font_part('Family', 'times')
            label_font.set_font_part('Pixel Size', '14')
        else:
            label_font.parse_font_spec(font_spec)

        label_font_color = gview.get_preference('legend-label-font-color')
        if label_font_color is None:
            label_font_color = (0.0, 0.0, 0.0, 1.0)
        else:
            label_font_color = color_string_to_tuple(label_font_color)
        label_ogr_color = gv_to_ogr_color(label_font_color)

        #handle large fonts in the sample text
        try:
            gdk_font = load_font(str(label_font))
        except:
            # get a default font if preferred one
            # can't be loaded.
            gdk_font = load_font('*')
            
        h = gdk_font.height("Wj")
        samp_offset = max(samp_y_size, h) + 10

        #handle multi-line text for the title.
        try:
            gdk_title_font = load_font(str(title_font))
        except:
            gdk_title_font = load_font('*')

        lines = string.split(self.classification.title, '\\n')

        x_offset = 10  #start title 10 pixels in from left edge
        col_offset = 30 #space columns apart
        y_offset = 35  #start title 35 pixels down from top edge
        title_width = 0
        max_height = 0

        #resize the window appropriately

        title_height = y_offset
        title_width = 0
        for idx in range(len(lines)):
            line = lines[idx]
            title_height = title_height + gdk_title_font.height(line)
            title_width = max(title_width, gdk_title_font.width(line))

        title_height = title_height + 10
        title_width = x_offset + title_width + 10

        cols = int (self.classification.count / 8)
        samps = min( 8, self.classification.count )

        samp_height = samps * (samp_offset) + 10
        samp_width = x_offset

        for i in range( cols + 1):
            idx = 8 * i
            col_width = 0
            while idx < self.classification.count and idx < 8 * (i + 1):
                name = self.classification.name[idx]
                width = samp_x_size + 20 + gdk_font.width(name)
                col_width = max(col_width, width)
                idx = idx + 1
            samp_width = samp_width + col_width + col_offset
        samp_width = samp_width + 10

        total_width = max(title_width, samp_width)
        total_height = title_height + samp_height

        self.resizing = TRUE

        if (self.get_window().width < total_width) or \
           (self.get_window().height < total_height):
            self.resize_count = self.resize_count + 1
            if self.resize_count < 2:
                self.set_usize(total_width, total_height)

        self.resizing = FALSE

        for idx in range(len(lines)):
            line = lines[idx]
            w = gdk_title_font.width(line)
            h = gdk_title_font.height(line)
            title_width = max(title_width, w)

            samp_text = gview.GvShape()
            samp_text.add_node( x_offset, y_offset )
            samp_text.set_property( '_gv_ogrfs',
                                'LABEL(c:' + title_ogr_color + \
                                ',f:"' + str(title_font) + '",' \
                                + 't:"' + line + '")' )

            self.shapes.append(samp_text)
            y_offset = y_offset + h

        if ((len(lines[0]) > 6) and (lines[0][:6] != 'Legend') and
            (lines[0][:6] != 'legend')):
            self.set_title('Legend: ' + lines[0] + '...')
        else:
            self.set_title(lines[0] + '...')
            
        y_offset = y_offset + 10
        title_offset = y_offset

        max_width = 0
        max_height = 0

        for class_id in range(self.classification.count):
            color = self.classification.get_color( class_id )
            symbol = self.classification.get_symbol( class_id )
            scale = self.classification.get_scale( class_id )
            if symbol is not None:
                samp = gview.GvShape( type = gview.GVSHAPE_POINT )
                samp.add_node( x_offset + (samp_x_size/2), 
                               y_offset + (samp_y_size/2) )
                ogrfs_color = '#%02x%02x%02x%02x' % (int(color[0] * 255.999),
                                                 int(color[1] * 255.999),
                                                 int(color[2] * 255.999),
                                                 int(color[3] * 255.999))
                ogrfs = "SYMBOL(id:%s,c:%s,s:%s)" % (symbol, ogrfs_color, 
                                              scale)
                samp.set_property( "_gv_ogrfs", ogrfs )
            else:
                samp = gview.GvShape( type = gview.GVSHAPE_AREA )
                samp.add_node( x_offset, y_offset )
                samp.add_node( x_offset+samp_x_size, y_offset )
                samp.add_node( x_offset+samp_x_size, y_offset+samp_y_size )
                samp.add_node( x_offset, y_offset+samp_y_size )
                samp.add_node( x_offset, y_offset )

                color = '%f %f %f %f' % color

                samp.set_property( '_gv_color', color )
                samp.set_property( '_gv_fill_color', color )

            self.shapes.append( samp )

            name = self.classification.name[class_id]
            samp_text = gview.GvShape()
            samp_text.add_node( x_offset+samp_x_size+10, y_offset + 17 )
            font = str(label_font)
            samp_text.set_property( '_gv_ogrfs',
                      'LABEL(c:' + label_ogr_color + \
                      ',f:"'+font+'",t:"'+name+'")'  )
            self.shapes.append( samp_text )

            this_width = samp_x_size + 20 + gdk_font.width(name)
            if max_width < this_width:
                max_width = this_width

            y_offset = y_offset + samp_offset

            if y_offset+samp_offset > self.viewarea.get_height():
                max_height = max(max_height, y_offset + samp_offset)
                y_offset = title_offset
                x_offset = x_offset + col_offset + max_width
                max_width = 0

        self.vlayer.changed()