linuxcnc/lib/python/gladevcp/hal_pyngcgui.py

175 lines
7.6 KiB
Python

#!/usr/bin/env python3
#------------------------------------------------------------------------------
# Copyright: 2013
# Author: Dewey Garrett <dgarrett@panix.com>
#
# This program 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 2 of the License, or
# (at your option) any later version.
#
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#------------------------------------------------------------------------------
import os
import gi
from gi.repository import Gtk
from gi.repository import GObject
from gi.repository import Pango
from . import hal_actions
import pyngcgui
g_module = os.path.basename(__file__)
#-----------------------------------------------------------------------------
# class to make a gladevcp widget:
class PyNgcGui(Gtk.Frame,hal_actions._EMC_ActionBase):
"""PyNgcGui -- gladevcp widget"""
__gtype_name__ = 'PyNgcGui'
__gproperties__ = {
'use_keyboard' : (GObject.TYPE_BOOLEAN
,'Use Popup Keyboard'
,'Yes or No'
,False
,GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT
),
'debug' : (GObject.TYPE_BOOLEAN
,'Debug'
,'Yes or No'
,False
,GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT
),
'verbose' : (GObject.TYPE_BOOLEAN
,'Verbose'
,'Yes or No'
,False
,GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT
),
'send_function_name': (GObject.TYPE_STRING
,'Send Function'
,'default_send | send_to_axis | dummy_send'
,'default_send'
,GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT
),
'send_to_dir': (GObject.TYPE_STRING
,'Send to dir'
,'None|touchy|dirname None(default:[DISPLAY]PROGRAM_PREFIX'
,''
,GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT
),
'control_font_name': (GObject.TYPE_STRING
,'Control Font'
,'example: Sans 10'
,'Sans 10'
,GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT
),
}
__gproperties = __gproperties__ # self.__gproperties
def __init__(self):
super(PyNgcGui,self).__init__(label=None) # glade creates label anyway
self.set_label(None) # this doesn't work here
# the two attempts above don't prevent glade from making a Frame label
# put default property values in self.property_dict[]
self.property_dict = {}
for name in self.__gproperties.keys():
gtype = self.__gproperties[name][0]
if ( gtype == GObject.TYPE_BOOLEAN
or gtype == GObject.TYPE_STRING):
ty,lbl,tip,dflt,other = self.__gproperties[name]
if ( gtype == GObject.TYPE_INT
or gtype == GObject.TYPE_FLOAT):
ty,lbl,tip,minv,maxv,dflt,other = self.__gproperties[name]
self.property_dict[name] = dflt
GObject.timeout_add(1,self.go_ngcgui) # deferred
def do_get_property(self,property):
name = property.name.replace('-', '_')
if name in self.property_dict.keys():
return self.property_dict[name]
else:
raise AttributeError(_('%s:unknown property %s')
% (g_module,property.name))
def do_set_property(self,property,value):
name = property.name.replace('-','_')
if name not in self.__gproperties.keys():
raise(AttributeError
,_('%s:pyngcgui:do_set_property: unknown <%s>')
% (g_module,name))
else:
pyngcgui.vprint('SET P[%s]=%s' % (name,value))
self.property_dict[name] = value
def go_ngcgui(self):
self.start_NgcGui(debug = self.property_dict['debug']
,verbose = self.property_dict['verbose']
,use_keyboard = self.property_dict['use_keyboard']
,send_function_name = self.property_dict['send_function_name']
,send_to_dir = self.property_dict['send_to_dir']
,control_font_name = self.property_dict['control_font_name']
)
GObject.timeout_add(1,self.remove_unwanted_label)
def remove_unwanted_label(self):
# coerce removal of unwanted label
self.set_label(None)
return False # one-time-only
def start_NgcGui(self
,debug=False
,verbose=False
,use_keyboard=False
,send_function_name=''
,send_to_dir=''
,control_font_name=None
):
thenotebook = Gtk.Notebook()
self.add(thenotebook) # tried with self=VBox,HBox,Frame
# Frame shows up best in glade designer
keyboardfile = None
if use_keyboard: keyboardfile = 'default'
send_function = None # None: let NgcGui handle it
if send_function_name == '': send_function = pyngcgui.default_send
elif send_function_name == 'dummy_send': send_function = pyngcgui.dummy_send
elif send_function_name == 'send_to_axis': send_function = pyngcgui.send_to_axis
elif send_function_name == 'default_send': send_function = pyngcgui.default_send
else:
print(_('%s:unknown send_function<%s>')
% (g_module,send_function_name))
if control_font_name is not None:
control_font = Pango.FontDescription(control_font_name)
auto_file = None # use default behavior
if send_to_dir.strip() == "": send_to_dir = None
if send_to_dir is not None:
if send_to_dir == 'touchy':
# allow sent file to show up in touchy auto tab page
send_to_dir = '~/linuxcnc/nc_files'
if not os.path.isdir(os.path.expanduser(send_to_dir)):
raise ValueError(_('%s:Not a directory:\n %s\n'
% (g_module,send_to_dir)))
auto_file = os.path.expanduser(
os.path.join(send_to_dir,'ngcgui_generated.ngc'))
self.ngcgui = pyngcgui.NgcGui(w=thenotebook
,debug=debug
,verbose=verbose
,keyboardfile=keyboardfile
,send_function=send_function # prototype: (fname)
,auto_file=auto_file # None for default behavior
,control_font=control_font
)