Package Gnumed :: Package timelinelib :: Package canvas :: Package drawing :: Module utils |
[frames] | no frames]

# Source Code for Module Gnumed.timelinelib.canvas.drawing.utils

     1  # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018  Rickard Lindberg, Roger Lindberg
     2  #
     3  # This file is part of Timeline.
     4  #
     5  # Timeline is free software: you can redistribute it and/or modify
     6  # it under the terms of the GNU General Public License as published by
     7  # the Free Software Foundation, either version 3 of the License, or
     8  # (at your option) any later version.
     9  #
    10  # Timeline is distributed in the hope that it will be useful,
    11  # but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13  # GNU General Public License for more details.
    14  #
    15  # You should have received a copy of the GNU General Public License
    16  # along with Timeline.  If not, see <http://www.gnu.org/licenses/>.
    17
    18
    19  import wx
    20
    21
    22 -class Metrics(object):
    23      """
    24      Convert between pixel coordinates and time coordinates.
    25      """
    26
    27 -    def __init__(self, size, time_type, time_period, divider_line_slider):
    28          self.width, self.height = size
    29          self.half_width = self.width / 2
    30          self.half_height = self.height / 2
    31          self.half_height = int(round(divider_line_slider * self.height))
    32          self.time_type = time_type
    33          self.time_period = time_period
    34
    35 -    def calc_exact_x(self, time):
    36          """Return the x position in pixels as a float for the given time."""
    37          return self.width * (
    38              (time - self.time_period.start_time) / self.time_period.delta()
    39          )
    40
    41 -    def calc_x(self, time):
    42          """Return the x position in pixels as an integer for the given time."""
    43          try:
    44              return int(round(self.calc_exact_x(time)))
    45          except OverflowError:
    46              if time < self.time_period.start_time:
    47                  return -1
    48              if time > self.time_period.end_time:
    49                  return self.width + 1
    50
    51 -    def calc_exact_width(self, time_period):
    52          """Return the with in pixels as a float for the given time_period."""
    53          return (self.calc_exact_x(time_period.end_time) -
    54                  self.calc_exact_x(time_period.start_time))
    55
    56 -    def calc_width(self, time_period):
    57          """Return the with in pixels as an integer for the given time_period."""
    58          return (self.calc_x(time_period.end_time) -
    59                  self.calc_x(time_period.start_time)) + 1
    60
    61 -    def get_time(self, x):
    62          """Return the time at pixel `x`."""
    63          if self.width == 0:
    64              x_percent_of_width = 0
    65          else:
    66              x_percent_of_width = float(x) / self.width
    67          return self.time_period.get_time_at_percent(x_percent_of_width)
    68
    69 -    def get_difftime(self, x1, x2):
    70          """Return the time length between two x positions."""
    71          return self.get_time(x1) - self.get_time(x2)
    72
    73
    74 -def darken_color(color, factor=0.7):
    75      if (factor < 0.0 or factor > 1.0):
    76          return color
    77      return tuple([int(x * factor) for x in color])
    78
    79
    80 -def lighten_color(color, factor=1.5):
    81      if (factor < 1.0 or factor > 255.0):
    82          return color
    83      if (color == (0, 0, 0)):
    84          color = (1, 1, 1)  # avoid multiplying factor by zero
    85      return tuple([min(int(x * factor), 255) for x in color])
    86
    87
    88 -def get_colour(rgb_tuple):
    89      return wx.Colour(rgb_tuple[0], rgb_tuple[1], rgb_tuple[2])
    90