Esempio n. 1
0
File: pie.py Progetto: tryton/tryton
    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()
Esempio n. 2
0
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
Esempio n. 3
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)
Esempio n. 4
0
    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)
Esempio n. 5
0
File: pie.py Progetto: tryton/tryton
    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)
Esempio n. 6
0
 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
Esempio n. 7
0
 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)
Esempio n. 8
0
 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 ''
Esempio n. 9
0
 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)
Esempio n. 10
0
 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)
Esempio n. 11
0
 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 ''
Esempio n. 12
0
 def _test_localize(self, value, out, grouping=False):
     self.assertEqual(locale.localize(value, grouping=grouping), out)
Esempio n. 13
0
    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))
Esempio n. 14
0
File: bar.py Progetto: tryton/tryton
    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)