app.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # @Author: Bachir Soussi Chiadmi <bach>
  4. # @Date: 23-05-2017
  5. # @Email: bachir@figureslibres.io
  6. # @Last modified by: bach
  7. # @Last modified time: 21-04-2017
  8. # @License: GPL-V3
  9. import sys, os
  10. from socket import socket
  11. import socketserver
  12. import http.server
  13. import threading
  14. from PyQt5.QtCore import QCoreApplication, QUrl, QFileSystemWatcher, pyqtSlot
  15. from PyQt5.QtGui import QKeySequence
  16. from PyQt5.QtWidgets import QWidget, QApplication, QShortcut, QGridLayout
  17. # from PyQt5.QtNetwork import QNetworkProxyFactory, QNetworkRequest
  18. from PyQt5.QtWebKit import QWebSettings
  19. from PyQt5.QtWebKitWidgets import QWebPage, QWebView, QWebInspector
  20. import sass
  21. class Server():
  22. def __init__(self, parent=None):
  23. # find free port
  24. sock = socket()
  25. sock.bind(('', 0))
  26. self._port = sock.getsockname()[1]
  27. sock.close()
  28. self.httpd = http.server.HTTPServer(('', self.port), http.server.SimpleHTTPRequestHandler)
  29. self.thread = threading.Thread(target=self.httpd.serve_forever)
  30. self.thread.start()
  31. print("serving at port", self._port)
  32. @property
  33. def port(self):
  34. return self._port
  35. class Compiler():
  36. def __init__(self,parent=None):
  37. paths = [
  38. 'assets',
  39. 'assets/scss',
  40. 'assets/scss/styles.scss'
  41. ]
  42. self.fs_watcher = QFileSystemWatcher(paths)
  43. self.fs_watcher.directoryChanged.connect(self.directory_changed)
  44. self.fs_watcher.fileChanged.connect(self.compile_scss)
  45. # self.compile_scss()
  46. def directory_changed(path):
  47. print("Directory changed : %s" % path)
  48. def compile_scss(path = ""):
  49. print("compiling sass : %s" % path)
  50. # src = open( 'assets/scss/main.scss' ).read()
  51. scss = sass.compile_file(b'assets/scss/main.scss')
  52. with open('assets/scss/main.css', 'w') as fp:
  53. fp.write(scss.decode('utf8'))
  54. class WebkitView(QWebView):
  55. def __init__(self, port):
  56. self.port = port
  57. # QT webkit
  58. self.view = QWebView.__init__(self)
  59. # browser.settings().setAttribute(QWebSettings.PluginsEnabled, True)
  60. self.load(QUrl('http://localhost:'+str(self.port)))
  61. # self.show()
  62. self.shortcut = QShortcut(QKeySequence("Ctrl+Q"), self)
  63. self.shortcut.activated.connect(self.on_quit)
  64. self.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
  65. # self.show()
  66. @pyqtSlot()
  67. def on_quit(self):
  68. print("Quit!")
  69. QCoreApplication.instance().quit()
  70. # class MainWindow():
  71. # def __init__(self, )
  72. def main():
  73. # app = QtCore.QCoreApplication(sys.argv)
  74. app = QApplication(sys.argv)
  75. server = Server()
  76. compiler = Compiler()
  77. grid = QGridLayout()
  78. webkitview = WebkitView(server.port)
  79. grid.addWidget(webkitview, 1, 0)
  80. webkitinspector = QWebInspector()
  81. webkitinspector.setPage(webkitview.page())
  82. grid.addWidget(webkitinspector, 2, 0)
  83. # main app window
  84. main_frame = QWidget()
  85. main_frame.setLayout(grid)
  86. main_frame.show()
  87. sys.exit(app.exec_())
  88. if __name__ == "__main__":
  89. main()