Browser inside task panel

Here's the place for discussion related to coding in FreeCAD, C++ or Python. Design, interfaces and structures.
Forum rules
Be nice to others! Respect the FreeCAD code of conduct!
User avatar
bernd
Veteran
Posts: 12851
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Browser inside task panel

Post by bernd »

I'd like to do a task panel with a form which displays some browser content (the html link to the content will be fix inside the task panel code). The user should be able to navigate through the content inside these form. Does someone has an idea what Qt/PySide form to use and where can I find an example in this regard? All should be done as macro or module in Python and PySide.

The content to display will be similar to this web page: http://autodesk-fusion.partcommunity.com

cheers bernd


EDIT: see https://forum.freecadweb.org/viewtopic. ... 10#p422372
ickby
Veteran
Posts: 3116
Joined: Wed Oct 05, 2011 7:36 am

Re: Browser inside task panel

Post by ickby »

Qt provides browser widgets you can easily embed. I think there is a difference if you use Qt4 or 5, but for 5 this should work:

http://doc.qt.io/qt-5/qwebengineview.html
User avatar
Kunda1
Veteran
Posts: 13434
Joined: Thu Jan 05, 2017 9:03 pm

Re: Browser inside task panel

Post by Kunda1 »

Looks like the Open Source Ecology is wanting to use websockets:
https://github.com/damoti/osedev-workbench
http://opensourceecology.org/wiki/OSEDev_Workbench
Alone you go faster. Together we go farther
Please mark thread [Solved]
Want to contribute back to FC? Checkout:
'good first issues' | Open TODOs and FIXMEs | How to Help FreeCAD | How to report Bugs
User avatar
bernd
Veteran
Posts: 12851
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Re: Browser inside task panel

Post by bernd »

User avatar
microelly2
Veteran
Posts: 4688
Joined: Tue Nov 12, 2013 4:06 pm
Contact:

Re: Browser inside task panel

Post by microelly2 »

I had the idea some days ago to run the report view with links back into the 3d scene.
Having a trace in html format in a dockwindow may do this and bring some comfort.
so lets wait for your first prototype. :geek:
User avatar
bernd
Veteran
Posts: 12851
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Re: Browser inside task panel

Post by bernd »

Code: Select all

import FreeCAD
import FreeCADGui
from PySide import QtCore, QtGui, QtWebKit


class TransWindow(QtGui.QDialog):
    """
    Example of a partially transparent browser window
    Base on screenshot: http://goo.gl/UiULPU
    """
    HOME = "http://www.forum.freecadweb.org"
    def __init__(self):
        super(TransWindow, self).__init__()
        self.resize(800,600)
        style = QtGui.qApp.style()
        self.backButton = QtGui.QToolButton(self)
        self.backButton.setIcon(style.standardIcon(style.SP_ArrowLeft))
        self.forwardButton = QtGui.QToolButton(self)
        self.forwardButton.setIcon(style.standardIcon(style.SP_ArrowRight))
        self.reloadButton = QtGui.QToolButton(self)
        self.reloadButton.setIcon(style.standardIcon(style.SP_BrowserReload))
        self.location = QtGui.QLineEdit(self)
        self.webView = QtWebKit.QWebView(self)
        self.webView.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        toolLayout = QtGui.QHBoxLayout()
        toolLayout.setSpacing(0)
        toolLayout.addWidget(self.backButton)
        toolLayout.addWidget(self.forwardButton)
        toolLayout.addSpacing(6)
        toolLayout.addWidget(self.reloadButton)
        toolLayout.addSpacing(6)
        toolLayout.addWidget(self.location)
        self.layout = QtGui.QVBoxLayout(self)
        self.layout.setSpacing(16)
        self.layout.addLayout(toolLayout)
        self.layout.addWidget(self.webView)
        self.setStyleSheet("""
            QDialog {
                background-color: rgba(50,50,50,35%);
                border-radius: 5px;
            }
            """)
        self.backButton.clicked.connect(self.webView.back)
        self.forwardButton.clicked.connect(self.webView.forward)
        self.reloadButton.clicked.connect(self.webView.reload)
        self.location.returnPressed.connect(self._updateLocation)
        self.webView.urlChanged.connect(self._locationChanged)
    def showEvent(self, event):
        super(TransWindow, self).showEvent(event)
        self.webView.load(QtCore.QUrl(self.HOME))
    def _updateLocation(self):
        text = self.location.text().strip()
        if not text:
            return
        # Being really basic here, for the demo
        url = QtCore.QUrl(text)
        if not url.scheme():
            url.setScheme("http")
        self.webView.load(url)
    def _locationChanged(self, url):
        self.location.setText(url.toString())


mw = FreeCADGui.getMainWindow()
d = QtGui.QDockWidget()
d.setWidget(TransWindow())
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea, d)
screen.jpg
screen.jpg (259.28 KiB) Viewed 4597 times
User avatar
bernd
Veteran
Posts: 12851
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Re: Browser inside task panel

Post by bernd »

less code lines ...

Code: Select all

import FreeCAD
import FreeCADGui
from PySide import QtCore, QtGui, QtWebKit


class TransWindow(QtGui.QDialog):
    HOME = "http://www.forum.freecadweb.org"
    def __init__(self):
        super(TransWindow, self).__init__()
        self.webView = QtWebKit.QWebView(self)
        self.webView.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addLayout(QtGui.QHBoxLayout())
        self.layout.addWidget(self.webView)

    def showEvent(self, event):
        super(TransWindow, self).showEvent(event)
        self.webView.load(QtCore.QUrl(self.HOME))


mw = FreeCADGui.getMainWindow()
d = QtGui.QDockWidget()
d.setWidget(TransWindow())
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea, d)
triplus
Veteran
Posts: 9471
Joined: Mon Dec 12, 2011 4:45 pm

Re: Browser inside task panel

Post by triplus »

Alternatively you i guess could just use Web Workbench for such task.
User avatar
bernd
Veteran
Posts: 12851
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Re: Browser inside task panel

Post by bernd »

the file :
partforfreecad.step
(969.9 KiB) Downloaded 193 times



A browser widget inside FreeCAD which includes the part above in FreeCAD by click on a text button. This was very helpful https://gist.github.com/webwurst/2203822

Code: Select all

import FreeCAD
import FreeCADGui
from PySide import QtCore, QtGui, QtWebKit

myhtml = """
<html>
<body>
    <h1>Test fuer Web Step Part Importer</h1><br>
    <h2><a href="#" onclick="jsWebPartImporter.text('https://forum.freecadweb.org/download/file.php?id=48016')">Press the Button to import the Part in FreeCAD</a></h2>
    <h2><a href="#" onclick="alert('Javascript works!')">Java Script Test</a></h2>
</body>
</html>
"""


class WebPartImporter(QtCore.QObject):
    def __init__(self, parent=None):
        super(WebPartImporter, self).__init__(parent)

    @QtCore.Slot(str)
    def text(self, pathToStepFile):
        print pathToStepFile
        import tempfile
        import os
        stepTmpFd, stepTmpPath = tempfile.mkstemp(suffix=".step")
        os.close(stepTmpFd)
        import urllib
        stepfile = urllib.URLopener()
        stepdata = stepfile.retrieve(pathToStepFile, stepTmpPath)
        import Part
        Part.show(Part.read(stepTmpPath))
        FreeCADGui.ActiveDocument.activeView().viewAxonometric()
        FreeCADGui.SendMsgToActiveView("ViewFit")
        os.remove(stepTmpPath)


class TransWindow(QtGui.QDialog):
    def __init__(self):
        super(TransWindow, self).__init__()
        self.webView = QtWebKit.QWebView(self)

        self.frame = self.webView.page().mainFrame()
        self.frame.addToJavaScriptWindowObject('jsWebPartImporter', WebPartImporter())

        self.webView.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addLayout(QtGui.QHBoxLayout())
        self.layout.addWidget(self.webView)


    def showEvent(self, event):
        super(TransWindow, self).showEvent(event)
        self.webView.setHtml(myhtml)



mw = FreeCADGui.getMainWindow()
d = QtGui.QDockWidget()
d.setWidget(TransWindow())
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea, d)
User avatar
bernd
Veteran
Posts: 12851
Joined: Sun Sep 08, 2013 8:07 pm
Location: Zürich, Switzerland
Contact:

Re: Browser inside task panel

Post by bernd »

another version which uses a step file and and html from my server. Next step is a html from one of the big part supplier I'm in contact with. :D

Code: Select all

import FreeCAD
import FreeCADGui
from PySide import QtCore, QtGui, QtWebKit


class WebPartImporter(QtCore.QObject):
    def __init__(self, parent=None):
        super(WebPartImporter, self).__init__(parent)

    @QtCore.Slot(str)
    def text(self, pathToStepFile):
        print pathToStepFile
        import tempfile
        import os
        stepTmpFd, stepTmpPath = tempfile.mkstemp(suffix=".step")
        os.close(stepTmpFd)
        import urllib
        stepfile = urllib.URLopener()
        stepdata = stepfile.retrieve(pathToStepFile, stepTmpPath)
        import Part
        Part.show(Part.read(stepTmpPath))
        FreeCADGui.ActiveDocument.activeView().viewAxonometric()
        FreeCADGui.SendMsgToActiveView("ViewFit")
        os.remove(stepTmpPath)


class TransWindow(QtGui.QDialog):
    def __init__(self):
        super(TransWindow, self).__init__()
        self.webView = QtWebKit.QWebView(self)

        self.frame = self.webView.page().mainFrame()
        self.frame.addToJavaScriptWindowObject('jsWebPartImporter', WebPartImporter())

        self.webView.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addLayout(QtGui.QHBoxLayout())
        self.layout.addWidget(self.webView)


    def showEvent(self, event):
        super(TransWindow, self).showEvent(event)
        self.webView.load(QtCore.QUrl('http://www.b75.ch/download/partimportinfreecad.html'))



mw = FreeCADGui.getMainWindow()
d = QtGui.QDockWidget()
d.setWidget(TransWindow())
mw.addDockWidget(QtCore.Qt.RightDockWidgetArea, d)

Post Reply