Source code for kvalikirstu2.gui_utils

"""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 new_buttonbar(parent_page): """ Adds a new wx.ribbon.RibbonPanel with a wx.ribbon.RibbonButtonBar to a wx.ribbon.RibbonPage. """ ribbon_panel = RB.RibbonPanel(parent_page, style=wx.BORDER_NONE | RB.RIBBON_PANEL_NO_AUTO_MINIMISE) ribbon_bb = RB.RibbonButtonBar(ribbon_panel) return ribbon_bb
[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