From c298228ce917a1c72df952e0f2db1246fc4676c7 Mon Sep 17 00:00:00 2001 From: N Oliver Date: Sat, 23 Mar 2013 14:36:15 -0700 Subject: [PATCH 1/4] attempting fix for issue 305 Encountered https://github.com/kliment/Printrun/issues/305#issuecomment-12306186 This edit removed the error, but I don't know what the original output was so I'm not sure if this really _fixes_ it, or is just a band-aid. --- printrun/webinterface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/printrun/webinterface.py b/printrun/webinterface.py index bc0d564..3f51f37 100644 --- a/printrun/webinterface.py +++ b/printrun/webinterface.py @@ -291,7 +291,7 @@ class WebInterface(object): pageText+="
  • Pause
  • \n" for i in gPronterPtr.cpbuttons: - pageText+="
  • "+i[0]+"
  • \n" + pageText+="
  • "+i.label+"
  • \n" #for i in gPronterPtr.custombuttons: # print(str(i)); From 3cfe86f96e7f7425744fb1f927fec4cb9ff0610f Mon Sep 17 00:00:00 2001 From: OliverEngineer Date: Sat, 23 Mar 2013 18:02:18 -0700 Subject: [PATCH 2/4] Adding AJAX to the web interface need to explore CherryPy & websockets, but this quick'n'dirty is a big speed increase --- printrun/webinterface.py | 73 ++++++++++++++++++----------------- {css => web/css}/style.css | 0 web/js/asyncCommand.js | 79 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 35 deletions(-) rename {css => web/css}/style.css (100%) create mode 100644 web/js/asyncCommand.js diff --git a/printrun/webinterface.py b/printrun/webinterface.py index 3f51f37..72c6c59 100644 --- a/printrun/webinterface.py +++ b/printrun/webinterface.py @@ -23,7 +23,7 @@ from printrun.printrun_utils import configfile, imagefile, sharedfile users = {} def PrintHeader(): - return '\n\nPronterface-Web\n\n\n\n' + return '\n\nPronterface-Web\n\n\n\n\n' def PrintMenu(): return '' @@ -284,14 +284,14 @@ class WebInterface(object): pageText = PrintHeader()+self.name+PrintMenu() pageText+="
    \n" pageText+="
    \n" - pageText+="
    • Connect
    • \n" - pageText+="
    • Disconnect
    • \n" - pageText+="
    • Reset
    • \n" - pageText+="
    • Print
    • \n" - pageText+="
    • Pause
    • \n" + pageText+="
      • Connect
      • \n" + pageText+="
      • Disconnect
      • \n" + pageText+="
      • Reset
      • \n" + pageText+="
      • Print
      • \n" + pageText+="
      • Pause
      • \n" for i in gPronterPtr.cpbuttons: - pageText+="
      • "+i.label+"
      • \n" + pageText+="
      • "+i.label+"
      • \n" #for i in gPronterPtr.custombuttons: # print(str(i)); @@ -303,38 +303,38 @@ class WebInterface(object): pageText+="" pageText+='' - pageText+='X Home' - pageText+='Y Home' - pageText+='All Home' - pageText+='Z Home' - pageText+='Y 100' - pageText+='Y 10' - pageText+='Y 1' - pageText+='Y .1' - pageText+='Y -.1' - pageText+='Y -1' - pageText+='Y -10' - pageText+='Y -100' - pageText+='X -100' - pageText+='X 100' - pageText+='X -10' - pageText+='X 10' - pageText+='X -1' - pageText+='X 1' - pageText+='X -.1' - pageText+='X .1' + pageText+='X Home' + pageText+='Y Home' + pageText+='All Home' + pageText+='Z Home' + pageText+='Y 100' + pageText+='Y 10' + pageText+='Y 1' + pageText+='Y .1' + pageText+='Y -.1' + pageText+='Y -1' + pageText+='Y -10' + pageText+='Y -100' + pageText+='X -100' + pageText+='X 100' + pageText+='X -10' + pageText+='X 10' + pageText+='X -1' + pageText+='X 1' + pageText+='X -.1' + pageText+='X .1' pageText+="" pageText+="
    \n" #endxy pageText+="
    " pageText+="" pageText+='' - pageText+='Z 10' - pageText+='Z 1' - pageText+='Z .1' - pageText+='Z -.1' - pageText+='Z -1' - pageText+='Z -10' + pageText+='Z 10' + pageText+='Z 1' + pageText+='Z .1' + pageText+='Z -.1' + pageText+='Z -1' + pageText+='Z -10' pageText+="" #TODO Map Z Moves pageText+="
    \n" #endz @@ -374,11 +374,14 @@ def KillWebInterfaceThread(): cherrypy.engine.exit() def StartWebInterfaceThread(webInterface): - current_dir = os.path.dirname(os.path.abspath(__file__)) + current_dir = os.path.dirname(os.path.abspath(__file__)) cherrypy.config.update({'engine.autoreload_on':False}) cherrypy.config.update(configfile(webInterface.pface.web_config or "http.config")) conf = {'/css/style.css': {'tools.staticfile.on': True, - 'tools.staticfile.filename': sharedfile('css/style.css'), + 'tools.staticfile.filename': sharedfile('web/style.css'), + }, + '/js/asyncCommand.js': {'tools.staticfile.on': True, + 'tools.staticfile.filename': sharedfile('web/js/asyncCommand.js'), }, '/images/control_xy.png': {'tools.staticfile.on': True, 'tools.staticfile.filename': imagefile('control_xy.png'), diff --git a/css/style.css b/web/css/style.css similarity index 100% rename from css/style.css rename to web/css/style.css diff --git a/web/js/asyncCommand.js b/web/js/asyncCommand.js new file mode 100644 index 0000000..f37ec8c --- /dev/null +++ b/web/js/asyncCommand.js @@ -0,0 +1,79 @@ +function pronterfaceWebInterface_setup(){ + pronterfaceWebInterface_attachAsync(); +} + +function pronterfaceWebInterface_attachAsync(){ + + var list = []; + if(document.getElementsByClassName){ + list = document.getElementsByClassName('command'); + }else if(document.getElementsByTagName){ + list = document.getElementsByTagName('a'); + list.concat( document.getElementsByTagName('area') ); + //TODO filter list via checking the className attributes + }else{ + console && console.error && console.error('unable to gather list of elements'); + return false; + } + + for(var i=0; i < list.length; i++){ + list[i].addEventListener && list[i].addEventListener( 'click', function(e){return pronterfaceWebInterface_asyncCommand(null, e);}, true ); + list[i].attachEvent && list[i].attachEvent( 'onclick', function(e){return pronterfaceWebInterface_asyncCommand(null, e);} ); + } + + return true; +} + + +function pronterfaceWebInterface_asyncCommand( urlOrElement, event ){ + + if( ! urlOrElement && event.target) + urlOrElement = event.target; + + var url = null; + if( typeof urlOrElement == 'string' ){ + url = urlOrElement; + }else{ + url = urlOrElement&&urlOrElement.href; + } + + if( typeof url != 'string' ){ + console && console.error && console.error('url not a string', urlOrElement, url); + return true; + } + + var httpRequest; + if (window.XMLHttpRequest) { // Mozilla, Safari, ... + httpRequest = new XMLHttpRequest(); + } else if (window.ActiveXObject) { // IE 8 and older + httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); + } + + if( ! httpRequest ){ + alert('no AJAX available?'); + // follow link + return true; + } + + //onreadystatechange + //onerror + httpRequest.open( 'GET', url, true); + httpRequest.send(null); + + // don't follow link + if( event ){ + event.stopImmediatePropagation && event.stopImmediatePropagation(); + event.defaultPrevented = true; + event.preventDefault && event.preventDefault(); + } + return false; +} + + +if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", pronterfaceWebInterface_setup, false); +} else if (document.attachEvent) { + document.attachEvent("onreadystatechange", pronterfaceWebInterface_setup); +} else { + document.onload = pronterfaceWebInterface_setup; +} From 06280e2ba802e301a3e4403ade886e668b8c29a2 Mon Sep 17 00:00:00 2001 From: N Oliver Date: Mon, 25 Mar 2013 16:38:13 -0700 Subject: [PATCH 3/4] Update webinterface.py oops! :'( web/css/style.css --- printrun/webinterface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/printrun/webinterface.py b/printrun/webinterface.py index 72c6c59..bb9690b 100644 --- a/printrun/webinterface.py +++ b/printrun/webinterface.py @@ -378,7 +378,7 @@ def StartWebInterfaceThread(webInterface): cherrypy.config.update({'engine.autoreload_on':False}) cherrypy.config.update(configfile(webInterface.pface.web_config or "http.config")) conf = {'/css/style.css': {'tools.staticfile.on': True, - 'tools.staticfile.filename': sharedfile('web/style.css'), + 'tools.staticfile.filename': sharedfile('web/css/style.css'), }, '/js/asyncCommand.js': {'tools.staticfile.on': True, 'tools.staticfile.filename': sharedfile('web/js/asyncCommand.js'), From 2aac06f9da22051bb5db9e7d4e0497b0fc1a75a0 Mon Sep 17 00:00:00 2001 From: Ken Aaker Date: Wed, 27 Mar 2013 19:45:30 -0500 Subject: [PATCH 4/4] Fix abort in wxColour_helper on OpenSUSE This replaces "" strings that cause aborts in python-wxWidgets wxColour_helper with Python None objects. This corrects an abort where the helper tries to fetch the first byte of the colour string even when it's 0 length. --- pronterface.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pronterface.py b/pronterface.py index 89536eb..9554bb7 100755 --- a/pronterface.py +++ b/pronterface.py @@ -283,16 +283,16 @@ class PronterWindow(MainWindow, pronsole.pronsole): if f>0: wx.CallAfter(self.btemp.SetValue, str(f)) self.set("last_bed_temperature", str(f)) - wx.CallAfter(self.setboff.SetBackgroundColour, "") - wx.CallAfter(self.setboff.SetForegroundColour, "") + wx.CallAfter(self.setboff.SetBackgroundColour, None) + wx.CallAfter(self.setboff.SetForegroundColour, None) wx.CallAfter(self.setbbtn.SetBackgroundColour, "#FFAA66") wx.CallAfter(self.setbbtn.SetForegroundColour, "#660000") wx.CallAfter(self.btemp.SetBackgroundColour, "#FFDABB") else: wx.CallAfter(self.setboff.SetBackgroundColour, "#0044CC") wx.CallAfter(self.setboff.SetForegroundColour, "white") - wx.CallAfter(self.setbbtn.SetBackgroundColour, "") - wx.CallAfter(self.setbbtn.SetForegroundColour, "") + wx.CallAfter(self.setbbtn.SetBackgroundColour, None) + wx.CallAfter(self.setbbtn.SetForegroundColour, None) wx.CallAfter(self.btemp.SetBackgroundColour, "white") wx.CallAfter(self.btemp.Refresh) @@ -302,16 +302,16 @@ class PronterWindow(MainWindow, pronsole.pronsole): if f > 0: wx.CallAfter(self.htemp.SetValue, str(f)) self.set("last_temperature", str(f)) - wx.CallAfter(self.settoff.SetBackgroundColour, "") - wx.CallAfter(self.settoff.SetForegroundColour, "") + wx.CallAfter(self.settoff.SetBackgroundColour, None) + wx.CallAfter(self.settoff.SetForegroundColour, None) wx.CallAfter(self.settbtn.SetBackgroundColour, "#FFAA66") wx.CallAfter(self.settbtn.SetForegroundColour, "#660000") wx.CallAfter(self.htemp.SetBackgroundColour, "#FFDABB") else: wx.CallAfter(self.settoff.SetBackgroundColour, "#0044CC") wx.CallAfter(self.settoff.SetForegroundColour, "white") - wx.CallAfter(self.settbtn.SetBackgroundColour, "") - wx.CallAfter(self.settbtn.SetForegroundColour, "") + wx.CallAfter(self.settbtn.SetBackgroundColour, None) + wx.CallAfter(self.settbtn.SetForegroundColour, None) wx.CallAfter(self.htemp.SetBackgroundColour, "white") wx.CallAfter(self.htemp.Refresh)