Package Gnumed :: Package timelinelib :: Package wxgui :: Package components :: Package propertyeditors :: Module iconeditor |
[frames] | no frames]

# Source Code for Module Gnumed.timelinelib.wxgui.components.propertyeditors.iconeditor

      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 os.path
     20
     21  import wx
     22
     23  from timelinelib.wxgui.components.propertyeditors.baseeditor import BaseEditor
     24
     25
     26 -class FileToBitmapConverter(object):
     27
     28 -    def __init__(self):
     29          self.MAX_SIZE = (128, 128)
     30
     31 -    def convert(self, path):
     32          try:
     33              image = wx.EmptyImage(0, 0)
     34              success = image.LoadFile(path)
     35              # LoadFile will show error popup if not successful
     36              if success:
     37                  # Resize image if too large
     38                  (w, h) = image.GetSize()
     39                  (W, H) = self.MAX_SIZE
     40                  if w > W:
     41                      factor = float(W) / float(w)
     42                      w = w * factor
     43                      h = h * factor
     44                  if h > H:
     45                      factor = float(H) / float(h)
     46                      w = w * factor
     47                      h = h * factor
     48                  image = image.Scale(w, h, wx.IMAGE_QUALITY_HIGH)
     49                  return image.ConvertToBitmap()
     50          except:
     51              pass
     52
     53
     54 -class IconEditorGuiCreator(wx.Panel):
     55
     56 -    def __init__(self, parent):
     57          wx.Panel.__init__(self, parent)
     58
     59 -    def create_sizer(self):
     60          return wx.GridBagSizer(5, 5)
     61
     62 -    def create_controls(self):
     63          self.MAX_SIZE = (128, 128)
     64          self.img_icon = self._create_icon()
     65          description = self._create_description()
     66          btn_select = self._create_select_button()
     67          btn_clear = self._create_clear_button()
     68          return (description, btn_select, btn_clear, self.img_icon)
     69
     70 -    def put_controls_in_sizer(self, sizer, controls):
     71          description, btn_select, btn_clear, img_icon = controls
     72          sizer.Add(description, wx.GBPosition(0, 0), wx.GBSpan(1, 2))
     73          sizer.Add(btn_select, wx.GBPosition(1, 0), wx.GBSpan(1, 1))
     74          sizer.Add(btn_clear, wx.GBPosition(1, 1), wx.GBSpan(1, 1))
     75          sizer.Add(img_icon, wx.GBPosition(0, 2), wx.GBSpan(2, 1))
     76
     77 -    def _create_select_button(self):
     78          btn = wx.Button(self, wx.ID_OPEN)
     79          self.Bind(wx.EVT_BUTTON, self._btn_select_on_click, btn)
     80          return btn
     81
     82 -    def _create_clear_button(self):
     83          btn = wx.Button(self, wx.ID_CLEAR)
     84          self.Bind(wx.EVT_BUTTON, self._btn_clear_on_click, btn)
     85          return btn
     86
     87 -    def _create_description(self):
     88          label = _("Images will be scaled to fit inside a %ix%i box.")
     89          return wx.StaticText(self, label=label % self.MAX_SIZE)
     90
     91 -    def _create_icon(self):
     92          return wx.StaticBitmap(self, size=self.MAX_SIZE)
     93
     94
     95 -class IconEditor(BaseEditor, IconEditorGuiCreator):
     96
     97 -    def __init__(self, parent, editor, name=""):
     98          BaseEditor.__init__(self, parent, editor)
     99          IconEditorGuiCreator.__init__(self, parent)
    100          self.create_gui()
    101          self._initialize_data()
    102
    103 -    def get_data(self):
    104          return self.get_icon()
    105
    106 -    def set_data(self, data):
    107          self.set_icon(data)
    108
    109 -    def clear_data(self):
    110          self.set_icon(None)
    111
    112 -    def set_icon(self, bmp):
    113          self.bmp = bmp
    114          if self.bmp is None:
    115              self.img_icon.SetBitmap(wx.EmptyBitmap(1, 1))
    116          else:
    117              self.img_icon.SetBitmap(bmp)
    118          self.GetSizer().Layout()
    119
    120 -    def get_icon(self):
    121          return self.bmp
    122
    123 -    def _initialize_data(self):
    124          self.bmp = None
    125
    126 -    def _btn_select_on_click(self, evt):
    127          dialog = wx.FileDialog(self, message=_("Select Icon"),
    128                                 wildcard="*", style=wx.FD_OPEN)
    129          if dialog.ShowModal() == wx.ID_OK:
    130              try:
    131                  bitmap = FileToBitmapConverter().convert(dialog.GetPath())
    132                  self.set_icon(bitmap)
    133              except:
    134                  pass
    135          dialog.Destroy()
    136
    137 -    def _btn_clear_on_click(self, evt):
    138          self.set_icon(None)
    139