"""A module for GUI util functions."""
import os
import wx
from wx import ribbon as RB
from kvalikirstu2 import argument_parser
COLOUR_XTRA_LIGHT = wx.Colour(250, 250, 250)
COLOUR_LIGHT = wx.Colour(240, 240, 240)
COLOUR_LIGHT_GREY = wx.Colour(230, 230, 230)
COLOUR_GREY = wx.Colour(200, 200, 200)
COLOUR_BLACK = wx.Colour(0, 0, 0)
[docs]def add_border_and_fit(panel, sizer, frame=None, max_size=None):
""" Adds a border and fit the frame.
:param frame: Frame.
:param sizer: The sizer of the frame.
:param panel: The panel of the frame.
:param max_size: A tuple containing the maximum size of the frame.
"""
args = argument_parser.get_args()
border = wx.BoxSizer()
border.Add(sizer, 1, wx.ALL | wx.EXPAND, args.padding)
panel.SetSizerAndFit(border)
if max_size:
panel.SetMaxSize(max_size)
if frame:
frame.Fit()
[docs]class Hotkey:
"""A class to store information about a certain hotkey for a window.
:var keycode: The keycode of the key.
:var modifiers: The bit mask to determine if ctrl/alt/shift should be held down for this key.
:var callback: The function callback when the key is pressed.
"""
def __init__(self, keycode, modifiers, callback):
self.keycode = keycode
self.modifiers = modifiers
self.callback = callback
[docs] def is_pressed(self, event):
"""Is the hotkey pressed?
:param event: Key pressing event.
"""
return event.GetKeyCode() == self.keycode and event.GetModifiers() == self.modifiers
[docs]class HotkeyMixin:
"""A mixin class to make adding hotkeys to windows easier.
:var hotkeys: A list of different hotkeys.
"""
def __init__(self):
self.Bind(wx.EVT_CHAR_HOOK, self._key_pressed)
self.hotkeys = []
def _key_pressed(self, event):
"""A key was pressed."""
for hotkey in self.hotkeys:
if hotkey.is_pressed(event):
hotkey.callback()
return
event.Skip()
def _add_hotkey(self, keycode, modifiers, callback):
"""Adds a hotkey to the window.
:param keycode: The keycode of the key.
:param modifiers: The bit mask to determine if ctrl/alt/shift should be held down for this key.
:param callback: The function callback when the key is pressed.
"""
self.hotkeys.append(Hotkey(keycode, modifiers, callback))
[docs]def add_separator_to_ribbon_page(parent_page, padding=1, li_style=wx.LI_VERTICAL):
"""Adds a separator line to wx.ribbon.RibbonPage parent_page.
"""
panel = RB.RibbonPanel(parent_page, style=wx.BORDER_NONE)
sz_ort = wx.HORIZONTAL if li_style == wx.LI_VERTICAL else wx.VERTICAL
sizer = wx.BoxSizer(sz_ort)
sizer.AddStretchSpacer(1)
sizer.Add(wx.StaticLine(panel, style=li_style), 0, wx.EXPAND | wx.ALL, padding)
sizer.AddStretchSpacer(1)
panel.SetSizer(sizer)
[docs]def set_ribbon_colours(ribbon, hide_panel_label=False):
""" Sets wx.ribbon.RibbonBar ribbon color scheme.
"""
art_prov = ribbon.GetArtProvider()
light = COLOUR_LIGHT
light_grey = COLOUR_LIGHT_GREY
grey = COLOUR_GREY
black = COLOUR_BLACK
art_prov.SetColourScheme(light, light, light)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_LABEL_COLOUR, black)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_ACTIVE_BORDER_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_ACTIVE_BACKGROUND_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_ACTIVE_BACKGROUND_GRADIENT_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_ACTIVE_BACKGROUND_TOP_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_ACTIVE_BACKGROUND_TOP_GRADIENT_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_HOVER_BORDER_COLOUR, grey)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_COLOUR, grey)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_GRADIENT_COLOUR, grey)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_TOP_COLOUR, grey)
art_prov.SetColour(RB.RIBBON_ART_BUTTON_BAR_HOVER_BACKGROUND_TOP_GRADIENT_COLOUR, grey)
art_prov.SetColour(RB.RIBBON_ART_PAGE_BORDER_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_PAGE_BACKGROUND_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_PAGE_BACKGROUND_GRADIENT_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_PAGE_BACKGROUND_TOP_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_PAGE_BACKGROUND_TOP_GRADIENT_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_PAGE_HOVER_BACKGROUND_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_PAGE_HOVER_BACKGROUND_GRADIENT_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_PAGE_HOVER_BACKGROUND_TOP_COLOUR, light)
art_prov.SetColour(RB.RIBBON_ART_PAGE_HOVER_BACKGROUND_TOP_GRADIENT_COLOUR, light)
panel_light = light
panel_light_grey = light_grey if not hide_panel_label else light
art_prov.SetColour(RB.RIBBON_ART_PANEL_BORDER_COLOUR, panel_light)
art_prov.SetColour(RB.RIBBON_ART_PANEL_BORDER_GRADIENT_COLOUR, panel_light)
art_prov.SetColour(RB.RIBBON_ART_PANEL_LABEL_COLOUR, wx.Colour(50, 50, 50))
art_prov.SetColour(RB.RIBBON_ART_PANEL_LABEL_BACKGROUND_COLOUR, panel_light_grey)
art_prov.SetColour(RB.RIBBON_ART_PANEL_LABEL_BACKGROUND_GRADIENT_COLOUR, panel_light_grey)
art_prov.SetColour(RB.RIBBON_ART_PANEL_HOVER_LABEL_BACKGROUND_COLOUR, panel_light_grey)
art_prov.SetColour(RB.RIBBON_ART_PANEL_HOVER_LABEL_BACKGROUND_GRADIENT_COLOUR, panel_light_grey)
art_prov.SetColour(RB.RIBBON_ART_PANEL_ACTIVE_BACKGROUND_COLOUR, panel_light)
art_prov.SetColour(RB.RIBBON_ART_PANEL_ACTIVE_BACKGROUND_GRADIENT_COLOUR, panel_light)
art_prov.SetColour(RB.RIBBON_ART_PANEL_ACTIVE_BACKGROUND_TOP_COLOUR, panel_light)
art_prov.SetColour(RB.RIBBON_ART_PANEL_ACTIVE_BACKGROUND_TOP_GRADIENT_COLOUR, panel_light)
art_prov.SetMetric(RB.RIBBON_ART_PAGE_BORDER_LEFT_SIZE, 7)
art_prov.SetMetric(RB.RIBBON_ART_PAGE_BORDER_RIGHT_SIZE, 7)
art_prov.SetMetric(RB.RIBBON_ART_PAGE_BORDER_TOP_SIZE, 7)
art_prov.SetMetric(RB.RIBBON_ART_PAGE_BORDER_BOTTOM_SIZE, 7)
art_prov.SetMetric(RB.RIBBON_ART_PANEL_X_SEPARATION_SIZE, 7)
art_prov.SetMetric(RB.RIBBON_ART_PANEL_Y_SEPARATION_SIZE, 7)
label_font = wx.Font(art_prov.GetFont(RB.RIBBON_ART_PANEL_LABEL_FONT))
label_font.MakeSmaller()
art_prov.SetFont(RB.RIBBON_ART_PANEL_LABEL_FONT, label_font)
[docs]def create_bitmap(img_name):
"""Creates a bitmap from a .png image in the icons folder.
:param img_name: The name of the .png file without extension.
"""
curr_dir = os.path.dirname(os.path.abspath(__file__))
img_path = os.path.join(curr_dir, "icons", "material_io_24")
icon_path = os.path.join(img_path, img_name + ".png")
wx_image = wx.Bitmap(icon_path, type=wx.BITMAP_TYPE_PNG)
return wx_image