design.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import sys, os, re
  4. from PyQt5 import QtCore
  5. from PyQt5.QtCore import QUrl, QSettings
  6. from PyQt5.QtGui import QKeySequence, QFont, QSyntaxHighlighter
  7. from PyQt5.QtWidgets import QWidget, QLabel, QTabWidget, QVBoxLayout, QHBoxLayout, QSplitter, QPlainTextEdit, QShortcut, QPushButton, QCheckBox
  8. from PyQt5.QtWebKit import QWebSettings
  9. from PyQt5.QtWebKitWidgets import QWebView, QWebInspector
  10. class WebkitView(QWebView):
  11. def __init__(self, parent, port):
  12. self.port = port
  13. self.view = QWebView.__init__(self, parent)
  14. self.load(QUrl('http://localhost:'+str(self.port)))
  15. self.settings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
  16. # self.settings().setAttribute(QWebSettings.PluginsEnabled, True)
  17. class WebkitInspector(QWebInspector):
  18. def __init__(self, parent, webkitview):
  19. super(WebkitInspector, self).__init__(parent)
  20. self.webkitview = webkitview
  21. self.setPage(self.webkitview.page())
  22. self.showMaximized()
  23. # TODO: webkitinspector is disappearing when chaging tabs
  24. class WebViewOptions(QWidget):
  25. def __init__(self, parent):
  26. super(WebViewOptions, self).__init__(parent)
  27. self.parent = parent
  28. self.hbox = QHBoxLayout()
  29. self.hbox.setContentsMargins(0,0,0,0)
  30. self.preview = QCheckBox('&Preview', self)
  31. # self.preview.setShortcut('Ctrl+Shift+p')
  32. self.preview.clicked.connect(self.onPreview)
  33. self.hbox.addWidget(self.preview)
  34. self.debug = QCheckBox('Deb&ug', self)
  35. # self.debug.setShortcut('Ctrl+Shift+u')
  36. self.debug.clicked.connect(self.onDebug)
  37. self.hbox.addWidget(self.debug)
  38. self.grid = QCheckBox('&Grid', self)
  39. # self.grid.setShortcut('Ctrl+Shift+g')
  40. self.grid.clicked.connect(self.onGrid)
  41. self.hbox.addWidget(self.grid)
  42. # spread
  43. self.spread = QCheckBox('&Spread', self)
  44. # self.spread.setShortcut('Ctrl+Shift+g')
  45. self.spread.clicked.connect(self.onSpread)
  46. self.hbox.addWidget(self.spread)
  47. self.hbox.addStretch()
  48. # zoom
  49. # page
  50. self.hbox.addStretch()
  51. self.reload = QPushButton("&Reload", self)
  52. # self.reload.setShortcut('Ctrl+Shift+r')
  53. # TODO: how to define same shortcut in different places
  54. # self.reload.setIcon(Icon(ico)))
  55. self.reload.clicked.connect(self.onReload)
  56. self.hbox.addWidget(self.reload)
  57. self.setLayout(self.hbox)
  58. def onReload(self):
  59. print("onReload")
  60. def onPreview(self):
  61. print('onPreview')
  62. def onDebug(self):
  63. print('onDebug')
  64. def onGrid(self):
  65. print('onGrid')
  66. def onSpread(self):
  67. print('onSpread')
  68. class CodeEditor(QPlainTextEdit):
  69. def __init__(self, core, tabs, file=None):
  70. super(CodeEditor, self).__init__()
  71. self.core = core
  72. self.tabs = tabs
  73. # self.file = file
  74. self.file = os.path.join(self.core.cwd,file)
  75. self.insertPlainText(open(self.file, 'r').read())
  76. self.changed = False
  77. self.textChanged.connect(self.onTextChanged)
  78. self.shortcut = QShortcut(QKeySequence("Ctrl+s"), self)
  79. self.shortcut.activated.connect(self.save)
  80. def onTextChanged(self):
  81. # print('textChanged')
  82. # print(self.toPlainText())
  83. # open(self.file, 'w').write(self.toPlainText())
  84. if not self.changed:
  85. self.changed = True
  86. i = self.tabs.currentIndex()
  87. self.tabs.setTabText(i, "* "+self.tabs.tabText(i))
  88. def save(self):
  89. if self.changed:
  90. open(self.file, 'w').write(self.toPlainText())
  91. i = self.tabs.currentIndex()
  92. self.tabs.setTabText(i, re.sub(r'^\*\s', '', self.tabs.tabText(i)))
  93. self.changed = False
  94. # TODO: how to combine file save and project save
  95. class Editor(QWidget):
  96. def __init__(self, parent, core):
  97. super(Editor, self).__init__()
  98. self.core = core
  99. self.layout = QVBoxLayout(self)
  100. self.layout.setContentsMargins(0,0,0,0)
  101. # Initialize tab screen
  102. self.tabs = QTabWidget()
  103. self.scsstab = CodeEditor(core, self.tabs, 'assets/css/styles.scss')
  104. self.jstab = CodeEditor(core, self.tabs, 'assets/js/script.js')
  105. # Add tabs
  106. self.tabs.addTab(self.scsstab,"scss")
  107. self.tabs.addTab(self.jstab,"js")
  108. # Add tabs to widget
  109. self.layout.addWidget(self.tabs)
  110. self.setLayout(self.layout)
  111. # font = QFont()
  112. # font.setFamily('Courier')
  113. # font.setFixedPitch(True)
  114. # font.setPointSize(10)
  115. # self.setFont(font)
  116. # self.highlighter = Highlighter(self.document())
  117. # https://pypi.python.org/pypi/QScintilla/2.9.2
  118. class DesignStack(QWidget):
  119. def __init__(self, core):
  120. super(DesignStack, self).__init__()
  121. # self.grid = QGridLayout()
  122. self.hbox = QHBoxLayout()
  123. self.hbox.setContentsMargins(0,0,0,0)
  124. self.setLayout(self.hbox)
  125. self.webview = QWidget()
  126. self.webview.vbox = QVBoxLayout()
  127. self.webview.setLayout(self.webview.vbox)
  128. self.webview.vbox.setContentsMargins(0,0,0,0)
  129. self.webkitview = WebkitView(self, core.server.port)
  130. self.webkitinspector = WebkitInspector(self, self.webkitview)
  131. shortcut = QShortcut(self)
  132. shortcut.setKey("F12")
  133. shortcut.activated.connect(self.toggleInspector)
  134. self.webkitinspector.setVisible(False)
  135. self.webviewoptions = WebViewOptions(self)
  136. self.webview.vbox.addWidget(self.webviewoptions)
  137. self.vsplitter = QSplitter(QtCore.Qt.Vertical)
  138. self.vsplitter.addWidget(self.webkitview)
  139. self.vsplitter.addWidget(self.webkitinspector)
  140. self.vsplitter.splitterMoved.connect(self.movedSplitter)
  141. self.webview.vbox.addWidget(self.vsplitter)
  142. self.hsplitter = QSplitter(QtCore.Qt.Horizontal)
  143. self.hsplitter.addWidget(self.webview)
  144. self.editor = Editor(self, core)
  145. self.hsplitter.addWidget(self.editor)
  146. self.hsplitter.splitterMoved.connect(self.movedSplitter)
  147. self.hbox.addWidget(self.hsplitter)
  148. self.restorePrefs()
  149. def toggleInspector(self):
  150. self.webkitinspector.setVisible(not self.webkitinspector.isVisible())
  151. def restorePrefs(self):
  152. settings = QSettings('FiguresLibres', 'Cascade')
  153. print(settings.value('design/vsplitter/sizes', self.vsplitter.sizes()))
  154. vals = settings.value('design/vsplitter/sizes', None)
  155. if vals:
  156. sizes = []
  157. for size in vals: sizes.append(int(size))
  158. self.vsplitter.setSizes(sizes)
  159. vals = settings.value('design/hsplitter/sizes', None)
  160. if vals:
  161. sizes = []
  162. for size in vals: sizes.append(int(size))
  163. self.hsplitter.setSizes(sizes)
  164. def movedSplitter(self):
  165. settings = QSettings('FiguresLibres', 'Cascade')
  166. # print(self.vsplitter.sizes())
  167. settings.setValue('design/vsplitter/sizes', self.vsplitter.sizes())
  168. settings.setValue('design/hsplitter/sizes', self.hsplitter.sizes())