def motion(self, widget, event): super(Pie, self).motion(widget, event) if not getattr(self, 'area', None): return d = (event.x - self.centerx)**2 + (event.y - self.centery)**2 if d > self.radius**2: self.popup.hide() for slice in self.slices: if slice.highlight: self.queue_draw() slice.highlight = False return self.popup.show() if event.y == self.centery: angle = math.pi / 2 else: angle = math.atan( (event.x - self.centerx) / (self.centery - event.y)) if event.x >= self.centerx: if event.y <= self.centery: pass else: angle += math.pi else: if event.y < self.centery: angle += 2 * math.pi else: angle += math.pi for slice in self.slices: if slice.startAngle <= angle <= slice.endAngle: if not slice.highlight: slice.highlight = True if 'timedelta' in self.yfields[0]: converter = self.yfields[0].get('timedelta') if converter: converter = rpc.CONTEXT.get(converter) value = common.timedelta.format( datetime.timedelta(seconds=slice.fraction * self.sum), converter) sum = common.timedelta.format( datetime.timedelta(seconds=self.sum), converter) else: value = locale.localize('{:.2f}'.format( slice.fraction * self.sum)) sum = locale.localize('{:.2f}'.format(self.sum)) label = '%s (%s%%)\n%s/%s' % ( self.labels[slice.xname], locale.localize('{:.2f}'.format( slice.fraction * 100)), value, sum) self.popup.set_text(label) self.queue_draw() else: if slice.highlight: slice.highlight = False self.queue_draw()
def humanize(size, suffix=''): for u in ['', 'K', 'M', 'G', 'T', 'P']: if size <= 1000: if isinstance(size, int) or size.is_integer(): size = locale.localize('{0:.0f}'.format(size)) else: size = locale.localize('{0:.{1}f}'.format(size, 2).rstrip('0')) return ''.join([size, u, suffix]) size /= 1000.0
def update_sum(self): selected_records = self.selected_records for name, label, highlight_sum_ in self.sum_widgets: sum_ = None selected_sum = None loaded = True digit = 0 field = self.group.fields[name] for record in self.group: if not record.get_loaded([name]) and record.id >= 0: loaded = False break value = field.get(record) if value is not None: if sum_ is None: sum_ = value else: sum_ += value if record in selected_records or not selected_records: if selected_sum is None: selected_sum = value else: selected_sum += value if hasattr(field, 'digits'): fdigits = field.digits(record) if fdigits and digit is not None: digit = max(fdigits[1], digit) else: digit = None if loaded: if field.attrs['type'] == 'timedelta': converter = field.converter(self.group) selected_sum = common.timedelta.format( selected_sum, converter) sum_ = common.timedelta.format(sum_, converter) elif digit: selected_sum = locale.localize( '{0:.{1}f}'.format(selected_sum or 0, digit), True) sum_ = locale.localize( '{0:.{1}f}'.format(sum_ or 0, digit), True) else: selected_sum = locale.localize( '{}'.format(selected_sum or 0), True) sum_ = locale.localize('{}'.format(sum_ or 0), True) # coog specific feature #8374 text1 = '%s /' % (selected_sum) text2 = ' %s' % (sum_) else: text1 = '' text2 = '-' if highlight_sum_ == "1": label.set_markup(text1 + '<b>' + text2 + '</b>') else: label.set_markup(text1 + text2)
def update_sum(self): selected_records = self.selected_records for name, label in self.sum_widgets: sum_ = None selected_sum = None loaded = True digit = 0 field = self.group.fields[name] for record in self.group: if not record.get_loaded([name]) and record.id >= 0: loaded = False break value = field.get(record) if value is not None: if sum_ is None: sum_ = value else: sum_ += value if record in selected_records or not selected_records: if selected_sum is None: selected_sum = value else: selected_sum += value if hasattr(field, 'digits'): fdigits = field.digits(record) if fdigits and digit is not None: digit = max(fdigits[1], digit) else: digit = None if loaded: if field.attrs['type'] == 'timedelta': converter = field.converter(self.group) selected_sum = common.timedelta.format( selected_sum, converter) sum_ = common.timedelta.format(sum_, converter) elif digit is not None: selected_sum = locale.localize( '{0:.{1}f}'.format(selected_sum or 0, digit), True) sum_ = locale.localize( '{0:.{1}f}'.format(sum_ or 0, digit), True) else: selected_sum = locale.localize( '{}'.format(selected_sum or 0), True) sum_ = locale.localize('{}'.format(sum_ or 0), True) text = '%s / %s' % (selected_sum, sum_) else: text = '-' label.set_text(text)
def drawAxis(self, cr, width, height): cr.set_source_rgb(*common.hex2rgb('#000000')) for slice in self.slices: normalisedAngle = slice.normalisedAngle() labelx = self.centerx + \ math.sin(normalisedAngle) * (self.radius + 10) labely = self.centery - \ math.cos(normalisedAngle) * (self.radius + 10) label = '%s (%s%%)' % (self.labels[slice.xname], locale.localize('{:.2f}'.format( slice.fraction * 100))) extents = cr.text_extents(label) labelWidth = extents[2] labelHeight = extents[3] x = y = 0 if normalisedAngle <= math.pi * 0.5: x = labelx y = labely - labelHeight elif math.pi / 2 < normalisedAngle <= math.pi: x = labelx y = labely elif math.pi < normalisedAngle <= math.pi * 1.5: x = labelx - labelWidth y = labely else: x = labelx - labelWidth y = labely - labelHeight cr.move_to(x, y) cr.show_text(label)
def YLabels(self): ylabels = [] if self.yrange == 0.0: base = 1 else: base = 10**int(math.log(self.yrange, 10)) for i in range(int(self.yrange / base) + 1): val = int(self.minyval / base) * base + i * base h = (val - self.minyval) * self.yscale label = locale.localize('{:.2f}'.format(val), True) ylabels.append((h, label)) return ylabels
def set_value(self, value): digits = self.digits if digits: self.widget.digits = digits[1] else: self.widget.digits = None self.widget.set_width_chars(self.width) if value is not None: txt_val = locale.localize( '{0:.{1}f}'.format(value, digits[1]), True) else: txt_val = '' self.widget.set_text(txt_val) reset_position(self.widget)
def get_client(self, record, factor=1): value = record.value.get(self.name) if value is not None: digits = self.digits(record, factor=factor) d = value * factor if not isinstance(d, Decimal): d = Decimal(repr(d)) if digits: p = int(digits[1]) else: p = -int(d.as_tuple().exponent) return locale.localize('{0:.{1}f}'.format(d, p), True) else: return ''
def format_float(): if (not value and (not isinstance(value, (int, float, Decimal)) or isinstance(value, bool))): return '' if isinstance(value, Decimal): cast = Decimal else: cast = float factor = cast(field.get('factor', 1)) try: digit = len(str(value * factor).rstrip('0').split('.')[1]) except IndexError: digit = 0 return locale.localize('{0:.{1}f}'.format(value * factor or 0, digit), True)
def format_float(): if (not value and (not isinstance(value, (int, float, Decimal)) or isinstance(value, bool))): return '' digit = 0 if isinstance(value, Decimal): cast = Decimal else: cast = float factor = cast(field.get('factor', 1)) string_ = str(value * factor) if 'e' in string_: string_, exp = string_.split('e') digit -= int(exp) if '.' in string_: digit += len(string_.rstrip('0').split('.')[1]) return locale.localize('{0:.{1}f}'.format(value * factor or 0, digit), True)
def get_client(self, record, factor=1, grouping=True): value = record.value.get(self.name) if value is not None: digits = self.digits(record, factor=factor) d = value * factor if not isinstance(d, Decimal): d = Decimal(repr(d)) if digits: p = int(digits[1]) elif d == d.to_integral_value(): p = 0 else: p = -int(d.as_tuple().exponent) monetary = self.attrs.get('monetary', False) return locale.localize('{0:.{1}f}'.format(d, p), grouping, monetary) else: return ''
def _test_localize(self, value, out, grouping=False): self.assertEqual(locale.localize(value, grouping=grouping), out)
def motion(self, widget, event): if not getattr(self, 'area', None): return nearest = None for point in self.points: x = point.x * self.area.w + self.area.x y = point.y * self.area.h + self.area.y square = (event.x - x)**2 + (event.y - y)**2 if not nearest or square < nearest[1]: nearest = (point, square) dia = self.area.w**2 + self.area.h**2 keys2txt = {} for yfield in self.yfields: keys2txt[yfield.get('key', yfield['name'])] = yfield['string'] highlight = False draw_points = [] yfields_timedelta = { x.get('key', x['name']): x.get('timedelta') for x in self.yfields if 'timedelta' in x } for point in self.points: if point == nearest[0] and nearest[1] < dia / 100: if not point.highlight: point.highlight = True label = keys2txt[point.yname] label += '\n' if point.yval in yfields_timedelta: converter = None if yfields_timedelta[point.yname]: converter = rpc.CONTEXT.get( yfields_timedelta[point.yname]) label += common.timedelta.format(point.yval, converter) else: label += locale.localize('{:.2f}'.format(point.yval), True) label += '\n' label += str(self.labels[point.xname]) self.popup.set_text(label) draw_points.append(point) else: if point.highlight: point.highlight = False draw_points.append(point) if point.highlight: self.popup.set_position(self, point.x * self.area.w + self.area.x, point.y * self.area.h + self.area.y) highlight = True if highlight: self.popup.show() else: self.popup.hide() if draw_points: minx = self.area.w + self.area.x miny = self.area.h + self.area.y maxx = maxy = 0.0 for point in draw_points: x = self.area.w * point.x + self.area.x y = self.area.h * point.y + self.area.y minx = min(x - 5, minx) miny = min(y - 5, miny) maxx = max(x + 5, maxx) maxy = max(y + 5, maxy) self.queue_draw_area(int(minx - 1), int(miny - 1), int(maxx - minx + 1), int(maxy - miny + 1))
def motion(self, widget, event): super(Bar, self).motion(widget, event) if not getattr(self, 'area', None): return def intersect(bar, event): x = self.area.w * bar.x + self.area.x y = self.area.h * bar.y + self.area.y w = self.area.w * bar.w h = self.area.h * bar.h if x <= event.x <= x + w and y <= event.y <= y + h: return True return False highlight = False draw_bars = [] yfields_timedelta = { x.get('key', x['name']): x.get('timedelta') for x in self.yfields if 'timedelta' in x } for bar in self.bars: if intersect(bar, event): if not bar.highlight: bar.highlight = True if bar.yname in yfields_timedelta: converter = None if yfields_timedelta[bar.yname]: converter = rpc.CONTEXT.get( yfields_timedelta[bar.yname]) label = common.timedelta.format( datetime.timedelta(seconds=bar.yval), converter) else: label = locale.localize('{:.2f}'.format(bar.yval), True) label += '\n' label += str(self.labels[bar.xname]) self.popup.set_text(label) draw_bars.append(bar) else: if bar.highlight: bar.highlight = False draw_bars.append(bar) if bar.highlight: highlight = True if highlight: self.popup.show() else: self.popup.hide() if draw_bars: minx = self.area.w + self.area.x miny = self.area.h + self.area.y maxx = maxy = 0.0 for bar in draw_bars: x = self.area.w * bar.x + self.area.x y = self.area.h * bar.y + self.area.y minx = int(min(x, minx)) miny = int(min(y, miny)) maxx = int(max(x + self.area.w * bar.w, maxx)) maxy = int(max(y + self.area.h * bar.h, maxy)) self.queue_draw_area(minx - 1, miny - 1, maxx - minx + 2, maxy - miny + 2)