def __init__(self, html, embed, view, force, cache): BaseFrame.__init__(self, None, wx.ID_ANY, lang.getstr("vrml_to_x3d_converter"), style=wx.DEFAULT_FRAME_STYLE & ~(wx.MAXIMIZE_BOX | wx.RESIZE_BORDER), name="vrml2x3dframe") self.SetIcons( config.get_icon_bundle([256, 48, 32, 16], appname + "-VRML-to-X3D-converter")) self.Bind(wx.EVT_CLOSE, self.OnClose) self.cache = cache self.embed = embed self.force = force self.html = html self.worker = Worker(self) sizer = wx.BoxSizer(wx.HORIZONTAL) self.SetSizer(sizer) panel = wx.Panel(self) sizer.Add(panel) panelsizer = wx.BoxSizer(wx.HORIZONTAL) panel.SetSizer(panelsizer) self.btn = BitmapButton(panel, wx.ID_ANY, config.geticon(256, "3d-primitives"), style=wx.NO_BORDER) self.btn.SetToolTipString(lang.getstr("file.select")) self.btn.Bind( wx.EVT_BUTTON, lambda event: vrmlfile2x3dfile(None, html=html, embed=embed, view=view, force=force, cache=cache, worker=self.worker)) self.droptarget = FileDrop(self) vrml_drop_handler = lambda vrmlpath: vrmlfile2x3dfile(vrmlpath, html=html, embed=embed, view=view, force=force, cache=cache, worker=self. worker) self.droptarget.drophandlers = { ".vrml": vrml_drop_handler, ".vrml.gz": vrml_drop_handler, ".wrl": vrml_drop_handler, ".wrl.gz": vrml_drop_handler, ".wrz": vrml_drop_handler } self.btn.SetDropTarget(self.droptarget) panelsizer.Add(self.btn, flag=wx.ALL, border=12) self.Fit() self.SetMinSize(self.GetSize()) self.SetMaxSize(self.GetSize())
def enable_btns(self, enable=True, enable_measure_button=False): self.is_measuring = not enable and enable_measure_button self.back_btn.Enable(enable and self.index > 0) self.next_btn.Enable(enable and self.index < self.index_max) self.measure_btn._bitmap = geticon(10, { True: "play", False: "pause" }.get(enable)) self.measure_btn.Enable(enable or enable_measure_button) self.measure_btn.SetDefault() if self.measure_btn.Enabled and not isinstance( self.FindFocus(), (wx.Control, CustomGrid)): self.measure_btn.SetFocus()
def measure_darken_background_ctrl_handler(self, event): if self.measure_darken_background_cb.GetValue() and \ getcfg("measure.darken_background.show_warning"): dlg = ConfirmDialog(self, msg=lang.getstr("measure.darken_background." "warning"), ok=lang.getstr("ok"), cancel=lang.getstr("cancel"), bitmap=geticon(32, "dialog-warning")) chk = wx.CheckBox(dlg, -1, lang.getstr("dialog.do_not_show_again")) dlg.Bind(wx.EVT_CHECKBOX, self.measure_darken_background_warning_handler, id=chk.GetId()) dlg.sizer3.Add(chk, flag=wx.TOP | wx.ALIGN_LEFT, border=12) dlg.sizer0.SetSizeHints(dlg) dlg.sizer0.Layout() rslt = dlg.ShowModal() if rslt == wx.ID_CANCEL: self.measure_darken_background_cb.SetValue(False) setcfg("measure.darken_background", int(self.measure_darken_background_cb.GetValue()))
def get_sound_on_off_btn_bitmap(self): if getcfg("measurement.play_sound"): bitmap = geticon(16, "sound_volume_full") else: bitmap = geticon(16, "sound_off") return bitmap
def __init__(self, parent=None, handler=None, keyhandler=None, start_timer=True): BaseFrame.__init__(self, parent, wx.ID_ANY, lang.getstr("measurement.untethered"), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL, name="untetheredframe") self.SetIcons(get_icon_bundle([256, 48, 32, 16], appname)) self.sizer = wx.FlexGridSizer(2, 1, 0, 0) self.sizer.AddGrowableCol(0) self.sizer.AddGrowableRow(0) self.sizer.AddGrowableRow(1) self.panel = wx_Panel(self) self.SetSizer(self.sizer) self.sizer.Add(self.panel, 1, wx.EXPAND) self.panel.SetBackgroundColour(BGCOLOUR) panelsizer = wx.FlexGridSizer(3, 2, 8, 8) panelsizer.AddGrowableCol(0) panelsizer.AddGrowableCol(1) panelsizer.AddGrowableRow(1) self.panel.SetSizer(panelsizer) self.label_RGB = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_RGB.SetForegroundColour(FGCOLOUR) panelsizer.Add(self.label_RGB, 0, wx.TOP | wx.LEFT | wx.EXPAND, border=8) self.label_XYZ = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_XYZ.SetForegroundColour(FGCOLOUR) panelsizer.Add(self.label_XYZ, 0, wx.TOP | wx.RIGHT | wx.EXPAND, border=8) if sys.platform == "darwin": style = wx.BORDER_THEME else: style = wx.BORDER_SIMPLE self.panel_RGB = BitmapBackgroundPanel(self.panel, size=(256, 256), style=style) self.panel_RGB.scalebitmap = (True, True) self.panel_RGB.SetBitmap( getbitmap("theme/checkerboard-32x32x5-333-444")) panelsizer.Add(self.panel_RGB, 1, wx.LEFT | wx.EXPAND, border=8) self.panel_XYZ = BitmapBackgroundPanel(self.panel, size=(256, 256), style=style) self.panel_XYZ.scalebitmap = (True, True) self.panel_XYZ.SetBitmap( getbitmap("theme/checkerboard-32x32x5-333-444")) panelsizer.Add(self.panel_XYZ, 1, wx.RIGHT | wx.EXPAND, border=8) sizer = wx.BoxSizer(wx.HORIZONTAL) self.back_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "back"), label="", fgcolour=FGCOLOUR) self.back_btn.Bind(wx.EVT_BUTTON, self.back_btn_handler) sizer.Add(self.back_btn, 0, wx.LEFT | wx.RIGHT, border=8) self.label_index = wx.StaticText(self.panel, wx.ID_ANY, " ") self.label_index.SetForegroundColour(FGCOLOUR) sizer.Add(self.label_index, 0, wx.ALIGN_CENTER_VERTICAL) self.next_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "play"), label="", fgcolour=FGCOLOUR) self.next_btn.Bind(wx.EVT_BUTTON, self.next_btn_handler) sizer.Add(self.next_btn, 0, wx.LEFT, border=8) sizer.Add((12, 1), 1) self.measure_auto_cb = CustomCheckBox(self.panel, wx.ID_ANY, lang.getstr("auto")) self.measure_auto_cb.SetForegroundColour(FGCOLOUR) self.measure_auto_cb.Bind(wx.EVT_CHECKBOX, self.measure_auto_ctrl_handler) sizer.Add(self.measure_auto_cb, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT) panelsizer.Add(sizer, 0, wx.BOTTOM | wx.EXPAND, border=8) sizer = wx.BoxSizer(wx.HORIZONTAL) self.measure_btn = FlatShadedButton(self.panel, bitmap=geticon(10, "play"), label=lang.getstr("measure"), fgcolour=FGCOLOUR) self.measure_btn.Bind(wx.EVT_BUTTON, self.measure_btn_handler) sizer.Add(self.measure_btn, 0, wx.RIGHT, border=6) # Sound when measuring # Needs to be stereo! self.measurement_sound = audio.Sound(get_data_path("beep.wav")) self.commit_sound = audio.Sound(get_data_path("camera_shutter.wav")) bitmap = self.get_sound_on_off_btn_bitmap() self.sound_on_off_btn = FlatShadedButton(self.panel, bitmap=bitmap, fgcolour=FGCOLOUR) self.sound_on_off_btn.SetToolTipString( lang.getstr("measurement.play_sound")) self.sound_on_off_btn.Bind(wx.EVT_BUTTON, self.measurement_play_sound_handler) sizer.Add(self.sound_on_off_btn, 0) sizer.Add((12, 1), 1) self.finish_btn = FlatShadedButton(self.panel, label=lang.getstr("finish"), fgcolour=FGCOLOUR) self.finish_btn.Bind(wx.EVT_BUTTON, self.finish_btn_handler) sizer.Add(self.finish_btn, 0, wx.RIGHT, border=8) panelsizer.Add(sizer, 0, wx.BOTTOM | wx.EXPAND, border=8) self.grid = CustomGrid(self, -1, size=(536, 256)) self.grid.DisableDragColSize() self.grid.DisableDragRowSize() self.grid.SetScrollRate(0, 5) self.grid.SetCellHighlightROPenWidth(0) self.grid.SetColLabelSize(self.grid.GetDefaultRowSize()) self.grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER) self.grid.SetRowLabelAlignment(wx.ALIGN_RIGHT, wx.ALIGN_CENTER) self.grid.draw_horizontal_grid_lines = False self.grid.draw_vertical_grid_lines = False self.grid.style = "" self.grid.CreateGrid(0, 9) self.grid.SetRowLabelSize(62) for i in range(9): if i in (3, 4): size = self.grid.GetDefaultRowSize() if i == 4: attr = wx.grid.GridCellAttr() attr.SetBackgroundColour(wx.Colour(0, 0, 0, 0)) self.grid.SetColAttr(i, attr) else: size = 62 self.grid.SetColSize(i, size) for i, label in enumerate( ["R", "G", "B", "", "", "L*", "a*", "b*", ""]): self.grid.SetColLabelValue(i, label) self.grid.SetCellHighlightPenWidth(0) self.grid.SetDefaultCellBackgroundColour( self.grid.GetLabelBackgroundColour()) font = self.grid.GetDefaultCellFont() if font.PointSize > 11: font.PointSize = 11 self.grid.SetDefaultCellFont(font) self.grid.SetSelectionMode(wx.grid.Grid.wxGridSelectRows) self.grid.EnableEditing(False) self.grid.EnableGridLines(False) self.grid.Bind(wx.grid.EVT_GRID_LABEL_LEFT_CLICK, self.grid_left_click_handler) self.grid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.grid_left_click_handler) self.sizer.Add(self.grid, 1, wx.EXPAND) self.Fit() self.SetMinSize(self.GetSize()) self.keyhandler = keyhandler self.id_to_keycode = {} if sys.platform == "darwin": # Use an accelerator table for tab, space, 0-9, A-Z, numpad, # navigation keys and processing keys keycodes = [wx.WXK_TAB, wx.WXK_SPACE] keycodes.extend(list(range(ord("0"), ord("9")))) keycodes.extend(list(range(ord("A"), ord("Z")))) keycodes.extend(numpad_keycodes) keycodes.extend(nav_keycodes) keycodes.extend(processing_keycodes) for keycode in keycodes: self.id_to_keycode[wx.Window.NewControlId()] = keycode accels = [] for id, keycode in self.id_to_keycode.items(): self.Bind(wx.EVT_MENU, self.key_handler, id=id) accels.append((wx.ACCEL_NORMAL, keycode, id)) if keycode == wx.WXK_TAB: accels.append((wx.ACCEL_SHIFT, keycode, id)) self.SetAcceleratorTable(wx.AcceleratorTable(accels)) else: self.Bind(wx.EVT_CHAR_HOOK, self.key_handler) self.Bind(wx.EVT_KEY_DOWN, self.key_handler) # Event handlers self.Bind(wx.EVT_CLOSE, self.OnClose, self) self.Bind(wx.EVT_MOVE, self.OnMove, self) self.Bind(wx.EVT_SIZE, self.OnResize, self) self.timer = wx.Timer(self) if handler: self.Bind(wx.EVT_TIMER, handler, self.timer) self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy, self) # Final initialization steps for child in self.GetAllChildren(): if (sys.platform == "win32" and sys.getwindowsversion() >= (6, ) and isinstance(child, wx.Panel)): # No need to enable double buffering under Linux and Mac OS X. # Under Windows, enabling double buffering on the panel seems # to work best to reduce flicker. child.SetDoubleBuffered(True) self.logger = get_file_logger("untethered") self._setup() self.Show() if start_timer: self.start_timer()
def info_handler(self, event): InfoDialog(self, msg=lang.getstr("measureframe.info"), ok=lang.getstr("ok"), bitmap=geticon(32, "dialog-information"), log=False)
def __init__(self, parent=None, id=-1): style = wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.MAXIMIZE_BOX) if (os.getenv("XDG_SESSION_TYPE") != "wayland" and getcfg("patterngenerator.use_pattern_window")): style |= wx.STAY_ON_TOP InvincibleFrame.__init__(self, parent, id, lang.getstr("measureframe.title"), style=style, name="measureframe") self.SetIcons(config.get_icon_bundle([256, 48, 32, 16], appname)) self.Bind(wx.EVT_CLOSE, self.close_handler, self) if os.getenv("XDG_SESSION_TYPE") != "wayland": self.Bind(wx.EVT_MOVE, self.move_handler, self) self.Bind(wx.EVT_SHOW, self.show_handler) self.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_SET_FOCUS, self.focus_handler) self.panel = BitmapBackgroundPanel(self) self.panel.scalebitmap = (False, False) if os.getenv("XDG_SESSION_TYPE") == "wayland": self.sizer = wx.FlexGridSizer(3, 1, 0, 0) self.sizer.AddGrowableCol(0) self.sizer.AddGrowableRow(1) else: self.sizer = wx.GridSizer(3, 1, 0, 0) self.panel.SetSizer(self.sizer) self.hsizer = wx.BoxSizer(wx.HORIZONTAL) self.sizer.Add(self.hsizer, flag=wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_TOP) self.zoommaxbutton = BitmapButton(self.panel, -1, geticon(16, "zoom-best-fit"), style=wx.NO_BORDER, name="zoommaxbutton") self.zoommaxbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.zoommax_handler, self.zoommaxbutton) self.hsizer.Add(self.zoommaxbutton, flag=wx.ALIGN_CENTER | wx.LEFT | wx.TOP | wx.BOTTOM, border=10) self.zoommaxbutton.SetToolTipString( lang.getstr("measureframe.zoommax")) self.hsizer.Add((8, 0)) self.zoominbutton = BitmapButton(self.panel, -1, geticon(16, "zoom-in"), style=wx.NO_BORDER, name="zoominbutton") self.zoominbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.zoomin_handler, self.zoominbutton) self.hsizer.Add(self.zoominbutton, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10) self.zoominbutton.SetToolTipString(lang.getstr("measureframe.zoomin")) self.hsizer.Add((8, 0)) self.zoomnormalbutton = BitmapButton(self.panel, -1, geticon(16, "zoom-original"), style=wx.NO_BORDER, name="zoomnormalbutton") self.zoomnormalbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.zoomnormal_handler, self.zoomnormalbutton) self.hsizer.Add(self.zoomnormalbutton, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10) self.zoomnormalbutton.SetToolTipString( lang.getstr("measureframe." "zoomnormal")) self.hsizer.Add((8, 0)) self.zoomoutbutton = BitmapButton(self.panel, -1, geticon(16, "zoom-out"), style=wx.NO_BORDER, name="zoomoutbutton") self.zoomoutbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.zoomout_handler, self.zoomoutbutton) self.hsizer.Add(self.zoomoutbutton, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.TOP | wx.BOTTOM, border=10) self.zoomoutbutton.SetToolTipString( lang.getstr("measureframe.zoomout")) if os.getenv("XDG_SESSION_TYPE") != "wayland": # No manual centering under Wayland... self.centerbutton = BitmapButton(self.panel, -1, geticon(16, "window-center"), style=wx.NO_BORDER, name="centerbutton") self.centerbutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.center_handler, self.centerbutton) self.sizer.Add(self.centerbutton, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=10) self.centerbutton.SetToolTipString( lang.getstr("measureframe.center")) else: self.centermsg = wx.StaticText( self.panel, -1, lang.getstr("measureframe.center.manual"), style=wx.ALIGN_CENTER_HORIZONTAL) self.centermsg.Wrap(self.hsizer.MinSize[0] - 20) self.sizer.Add(self.centermsg, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RIGHT, border=10) self.vsizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.vsizer, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL) if (os.getenv("XDG_SESSION_TYPE") != "wayland" or config.is_virtual_display()): self.measure_darken_background_cb = wx.CheckBox( self.panel, -1, lang.getstr("measure.darken_background")) self.measure_darken_background_cb.SetValue( bool(int(getcfg("measure.darken_background")))) self.measure_darken_background_cb.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_CHECKBOX, self.measure_darken_background_ctrl_handler, id=self.measure_darken_background_cb.GetId()) self.vsizer.Add(self.measure_darken_background_cb, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.LEFT | wx.RIGHT | wx.TOP, border=10) else: self.vsizer.Add((10, 10)) self.measurebutton = wx.Button( self.panel, -1, lang.getstr("measureframe.measurebutton"), name="measurebutton") self.measurebutton.Bind(wx.EVT_KILL_FOCUS, self.focus_lost_handler) self.Bind(wx.EVT_BUTTON, self.measure_handler, self.measurebutton) self.vsizer.Add(self.measurebutton, flag=wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, border=10) self.measurebutton.SetMaxFontSize(11) self.measurebutton.SetDefault() self.last_focused = self.measurebutton self.display_no = wx.Display.GetFromWindow(self) self.display_rects = get_display_rects() self.sizer.SetSizeHints(self)