Source code for timelinelib.wxgui.components.propertyeditors.iconeditor

# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018  Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline.  If not, see <http://www.gnu.org/licenses/>.


import os.path

import wx

from timelinelib.wxgui.components.propertyeditors.baseeditor import BaseEditor


[docs]class FileToBitmapConverter:
[docs] def __init__(self): self.MAX_SIZE = (128, 128)
[docs] def convert(self, path): try: image = wx.Image(0, 0) success = image.LoadFile(path) # LoadFile will show error popup if not successful if success: # Resize image if too large (w, h) = image.GetSize() (W, H) = self.MAX_SIZE if w > W: factor = float(W) / float(w) w = w * factor h = h * factor if h > H: factor = float(H) / float(h) w = w * factor h = h * factor image = image.Scale(w, h, wx.IMAGE_QUALITY_HIGH) return image.ConvertToBitmap() except: pass
[docs]class IconEditorGuiCreator(wx.Panel):
[docs] def __init__(self, parent): wx.Panel.__init__(self, parent)
[docs] def create_sizer(self): return wx.GridBagSizer(5, 5)
[docs] def create_controls(self): self.MAX_SIZE = (128, 128) self.img_icon = self._create_icon() description = self._create_description() btn_select = self._create_select_button() btn_clear = self._create_clear_button() return description, btn_select, btn_clear, self.img_icon
[docs] def put_controls_in_sizer(self, sizer, controls): description, btn_select, btn_clear, img_icon = controls sizer.Add(description, wx.GBPosition(0, 0), wx.GBSpan(1, 2)) sizer.Add(btn_select, wx.GBPosition(1, 0), wx.GBSpan(1, 1)) sizer.Add(btn_clear, wx.GBPosition(1, 1), wx.GBSpan(1, 1)) sizer.Add(img_icon, wx.GBPosition(0, 2), wx.GBSpan(2, 1))
def _create_select_button(self): btn = wx.Button(self, wx.ID_OPEN) self.Bind(wx.EVT_BUTTON, self._btn_select_on_click, btn) return btn def _create_clear_button(self): btn = wx.Button(self, wx.ID_CLEAR) self.Bind(wx.EVT_BUTTON, self._btn_clear_on_click, btn) return btn def _create_description(self): label = _("Images will be scaled to fit inside a %ix%i box.") return wx.StaticText(self, label=label % self.MAX_SIZE) def _create_icon(self): return wx.StaticBitmap(self, size=self.MAX_SIZE)
[docs]class IconEditor(BaseEditor, IconEditorGuiCreator):
[docs] def __init__(self, parent, editor, name=""): BaseEditor.__init__(self, parent, editor) IconEditorGuiCreator.__init__(self, parent) self.create_gui() self._initialize_data()
[docs] def get_data(self): return self.get_icon()
[docs] def set_data(self, data): self.set_icon(data)
[docs] def clear_data(self): self.set_icon(None)
[docs] def set_icon(self, bmp): self.bmp = bmp if self.bmp is None: self.img_icon.SetBitmap(wx.EmptyBitmap(1, 1)) else: self.img_icon.SetBitmap(bmp) self.GetSizer().Layout()
[docs] def get_icon(self): return self.bmp
def _initialize_data(self): self.bmp = None def _btn_select_on_click(self, evt): dialog = wx.FileDialog(self, message=_("Select Icon"), wildcard="*", style=wx.FD_OPEN) if dialog.ShowModal() == wx.ID_OK: try: bitmap = FileToBitmapConverter().convert(dialog.GetPath()) self.set_icon(bitmap) except: pass dialog.Destroy() def _btn_clear_on_click(self, evt): self.set_icon(None)