Moved theme functions in a separate module

This commit is contained in:
Olivier Keshavjee 2015-06-18 23:09:35 +02:00
parent 915b9ac5bc
commit 54751611bb
4 changed files with 231 additions and 206 deletions

View file

@ -6,6 +6,7 @@ from qt import *
from ui.settings import *
from enums import *
from functions import *
from ui.editors.themes import *
import settings
import os
@ -82,13 +83,6 @@ class settingsWindow(QWidget, Ui_Settings):
# Fullscreen
self._editingTheme = None
# Preview editor
self.previewText = QTextEdit()
self.previewText.setFrameStyle(QFrame.NoFrame)
self.previewText.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.previewText.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.previewText.setPlainText(open(appPath("resources/themes/preview.txt")).read())
# UI stuff
self.btnThemeEditOK.setIcon(qApp.style().standardIcon(QStyle.SP_DialogApplyButton))
self.btnThemeEditOK.clicked.connect(self.saveTheme)
self.btnThemeEditCancel.setIcon(qApp.style().standardIcon(QStyle.SP_DialogCancelButton))
@ -331,7 +325,7 @@ class settingsWindow(QWidget, Ui_Settings):
for t in lst:
theme = os.path.join(p, t)
editable = not appPath() in theme
n = self.getThemeName(theme)
n = getThemeName(theme)
item = QListWidgetItem(n)
item.setData(Qt.UserRole, theme)
@ -341,7 +335,9 @@ class settingsWindow(QWidget, Ui_Settings):
px = QPixmap(200, 120)
px.fill(Qt.white)
if not os.path.exists(thumb):
thumb = self.createPreview(theme)
currentScreen = qApp.desktop().screenNumber(self)
screenRect = qApp.desktop().screenGeometry(currentScreen)
thumb = createThemePreview(theme, screenRect)
icon = QPixmap(thumb).scaled(200, 120, Qt.KeepAspectRatio)
painter = QPainter(px)
@ -351,21 +347,13 @@ class settingsWindow(QWidget, Ui_Settings):
self.lstThemes.addItem(item)
self.lstThemes.setIconSize(QSize(200, 120))
def getThemeName(self, theme):
settings = QSettings(theme, QSettings.IniFormat)
if settings.contains("Name"):
return settings.value("Name")
else:
return os.path.splitext(os.path.split(theme)[1])[0]
def loadTheme(self, theme):
self._editingTheme = theme
self._loadingTheme = True # So we don't generate preview while loading
# Load datas
self.loadThemeDatas(theme)
self._themeData = loadThemeDatas(theme)
# Window Background
self.btnThemWindowBackgroundColor.clicked.connect(lambda: self.getThemeColor("Background/Color"))
@ -413,45 +401,6 @@ class settingsWindow(QWidget, Ui_Settings):
self._loadingTheme = False
self.updatePreview()
def loadThemeDatas(self, theme):
settings = QSettings(theme, QSettings.IniFormat)
self._themeData = {}
# Theme name
self._themeData["Name"] = self.getThemeName(theme)
# Window Background
self.loadSetting(settings, "Background/Color", "#000000")
self.loadSetting(settings, "Background/ImageFile", "")
self.loadSetting(settings, "Background/Type", 0)
# Text Background
self.loadSetting(settings, "Foreground/Color", "#ffffff")
self.loadSetting(settings, "Foreground/Opacity", 50)
self.loadSetting(settings, "Foreground/Margin", 40)
self.loadSetting(settings, "Foreground/Padding", 10)
self.loadSetting(settings, "Foreground/Position", 1)
self.loadSetting(settings, "Foreground/Rounding", 5)
self.loadSetting(settings, "Foreground/Width", 700)
# Text Options
self.loadSetting(settings, "Text/Color", "#ffffff")
self.loadSetting(settings, "Text/Font", qApp.font().toString())
self.loadSetting(settings, "Text/Misspelled", "#ff0000")
# Paragraph Options
self.loadSetting(settings, "Spacings/IndendFirstLine", False)
self.loadSetting(settings, "Spacings/LineSpacing", 100)
self.loadSetting(settings, "Spacings/ParagraphAbove", 0)
self.loadSetting(settings, "Spacings/ParagraphBelow", 0)
self.loadSetting(settings, "Spacings/TabWidth", 48)
def loadSetting(self, settings, key, default):
if settings.contains(key):
self._themeData[key] = type(default)(settings.value(key))
else:
self._themeData[key] = default
def setSetting(self, key, val):
self._themeData[key] = val
self.updatePreview()
@ -554,26 +503,12 @@ class settingsWindow(QWidget, Ui_Settings):
if self._loadingTheme:
return
px = self.createPreview(self._editingTheme, self.lblPreview.size())
currentScreen = qApp.desktop().screenNumber(self)
screen = qApp.desktop().screenGeometry(currentScreen)
px = createThemePreview(self._themeData, screen, self.lblPreview.size())
self.lblPreview.setPixmap(px)
def createPreview(self, theme, size=QSize(200, 120)):
pixmap = self.getPixmapFromTheme(theme)
px = QPixmap(pixmap).scaled(size, Qt.KeepAspectRatio)
w = px.width() / 10
h = px.height() / 10
r = self.textRect()
painter = QPainter(px)
painter.drawPixmap(QRect(w, h, w*4, h*5), pixmap, QRect(r.topLeft() - QPoint(w/3, h/3), QSize(w*4, h*5)))
painter.setPen(Qt.white)
painter.drawRect(QRect(w, h, w*4, h*5))
painter.end()
return px
def setButtonColor(self, btn, color):
btn.setStyleSheet("background:{};".format(color))
@ -592,135 +527,6 @@ class settingsWindow(QWidget, Ui_Settings):
def cancelEdit(self):
self.themeStack.setCurrentIndex(0)
self._editingTheme = None
def getPixmapFromTheme(self, theme):
if not self._editingTheme:
self.loadThemeDatas(theme)
currentScreen = qApp.desktop().screenNumber(self)
screen = qApp.desktop().screenGeometry(currentScreen)
# Window Background
px = QPixmap(screen.size())
px.fill(QColor(self._themeData["Background/Color"]))
painter = QPainter(px)
if self._themeData["Background/ImageFile"]:
path = findBackground(self._themeData["Background/ImageFile"])
_type =self._themeData["Background/Type"]
if path and _type > 0:
if _type == 1: # Tiled
painter.fillRect(screen, QBrush(QImage(path)))
else:
img = QImage(path)
scaled = img.size()
if _type == 3: # Stretched
scaled.scale(screen.size(), Qt.IgnoreAspectRatio)
elif _type == 4: # Scaled
scaled.scale(screen.size(), Qt.KeepAspectRatio)
elif _type == 5: # Zoomed
scaled.scale(screen.size(), Qt.KeepAspectRatioByExpanding)
painter.drawImage((screen.width() - scaled.width()) / 2, (screen.height() - scaled.height()) / 2, img.scaled(scaled))
# Text Background
textRect = self.textRect()
painter.save()
color = QColor(self._themeData["Foreground/Color"])
color.setAlpha(self._themeData["Foreground/Opacity"] * 255 / 100)
painter.setBrush(color)
painter.setPen(Qt.NoPen)
r = self._themeData["Foreground/Rounding"]
painter.drawRoundedRect(textRect, r, r)
painter.restore()
painter.end()
# Text
padding = self._themeData["Foreground/Padding"]
x = textRect.x() + padding
y = textRect.y() + padding + self._themeData["Spacings/ParagraphAbove"]
width = textRect.width() - 2 * padding
height = textRect.height() - 2 * padding - self._themeData["Spacings/ParagraphAbove"]
self.previewText.setGeometry(x, y, width, height)
p = self.previewText.palette()
p.setBrush(QPalette.Base, QBrush(px.copy(x, y, width, height)))
p.setColor(QPalette.Text, QColor(self._themeData["Text/Color"]))
p.setColor(QPalette.Highlight, QColor(self._themeData["Text/Color"]))
p.setColor(QPalette.HighlightedText, Qt.black if qGray(QColor(self._themeData["Text/Color"]).rgb()) > 127 else Qt.white)
self.previewText.setPalette(p)
bf = QTextBlockFormat()
bf.setLineHeight(self._themeData["Spacings/LineSpacing"], QTextBlockFormat.ProportionalHeight)
bf.setTextIndent(self._themeData["Spacings/TabWidth"] * 1 if self._themeData["Spacings/IndendFirstLine"] else 0)
bf.setTopMargin(self._themeData["Spacings/ParagraphAbove"])
bf.setBottomMargin(self._themeData["Spacings/ParagraphBelow"])
b = self.previewText.document().firstBlock()
cursor = self.previewText.textCursor()
while b.isValid():
bf2 = b.blockFormat()
bf2.merge(bf)
cursor.setPosition(b.position())
#cursor.setPosition(b.position(), QTextCursor.KeepAnchor)
cursor.setBlockFormat(bf2)
b = b.next()
self.previewText.setTabStopWidth(self._themeData["Spacings/TabWidth"])
self.previewText.document().setIndentWidth(self._themeData["Spacings/TabWidth"])
f = QFont()
f.fromString(self._themeData["Text/Font"])
self.previewText.setFont(f)
self.previewText.render(px, self.previewText.pos())
return px
## Text Background
##self._themeData["Foreground/Color"]
##self._themeData["Foreground/Opacity"]
##self._themeData["Foreground/Margin"]
##self._themeData["Foreground/Padding"]
##self._themeData["Foreground/Position"]
##self._themeData["Foreground/Rounding"]
##self._themeData["Foreground/Width"]
## Text Options
##self._themeData["Text/Color"]
##self._themeData["Text/Font"]
#self._themeData["Text/Misspelled"]
## Paragraph Options
##self._themeData["Spacings/IndendFirstLine"]
##self._themeData["Spacings/LineSpacing"]
##self._themeData["Spacings/ParagraphAbove"]
##self._themeData["Spacings/ParagraphBelow"]
##self._themeData["Spacings/TabWidth"]
def textRect(self):
currentScreen = qApp.desktop().screenNumber(self)
screen = qApp.desktop().screenGeometry(currentScreen)
margin = self._themeData["Foreground/Margin"]
x = 0
y = margin
width = min(self._themeData["Foreground/Width"], screen.width() - 2 * margin)
height = screen.height() - 2 * margin
if self._themeData["Foreground/Position"] == 0: # Left
x = margin
elif self._themeData["Foreground/Position"] == 1: # Center
x = (screen.width() - width) / 2
elif self._themeData["Foreground/Position"] == 2: # Right
x = screen.width() - margin - width
elif self._themeData["Foreground/Position"] == 3: # Stretched
x = margin
width = screen.width() - 2 * margin
return QRect(x, y, width, height)
def resizeEvent(self, event):
QWidget.resizeEvent(self, event)

207
src/ui/editors/themes.py Normal file
View file

@ -0,0 +1,207 @@
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from functions import *
import settings
def loadThemeDatas(themeFile):
settings = QSettings(themeFile, QSettings.IniFormat)
_themeData = {}
# Theme name
_themeData["Name"] = getThemeName(themeFile)
# Window Background
loadThemeSetting(_themeData, settings, "Background/Color", "#000000")
loadThemeSetting(_themeData, settings, "Background/ImageFile", "")
loadThemeSetting(_themeData, settings, "Background/Type", 0)
# Text Background
loadThemeSetting(_themeData, settings, "Foreground/Color", "#ffffff")
loadThemeSetting(_themeData, settings, "Foreground/Opacity", 50)
loadThemeSetting(_themeData, settings, "Foreground/Margin", 40)
loadThemeSetting(_themeData, settings, "Foreground/Padding", 10)
loadThemeSetting(_themeData, settings, "Foreground/Position", 1)
loadThemeSetting(_themeData, settings, "Foreground/Rounding", 5)
loadThemeSetting(_themeData, settings, "Foreground/Width", 700)
# Text Options
loadThemeSetting(_themeData, settings, "Text/Color", "#ffffff")
loadThemeSetting(_themeData, settings, "Text/Font", qApp.font().toString())
loadThemeSetting(_themeData, settings, "Text/Misspelled", "#ff0000")
# Paragraph Options
loadThemeSetting(_themeData, settings, "Spacings/IndendFirstLine", False)
loadThemeSetting(_themeData, settings, "Spacings/LineSpacing", 100)
loadThemeSetting(_themeData, settings, "Spacings/ParagraphAbove", 0)
loadThemeSetting(_themeData, settings, "Spacings/ParagraphBelow", 0)
loadThemeSetting(_themeData, settings, "Spacings/TabWidth", 48)
return _themeData
def loadThemeSetting(datas, settings, key, default):
if settings.contains(key):
datas[key] = type(default)(settings.value(key))
else:
datas[key] = default
def getThemeName(theme):
settings = QSettings(theme, QSettings.IniFormat)
if settings.contains("Name"):
return settings.value("Name")
else:
return os.path.splitext(os.path.split(theme)[1])[0]
def themeTextRect(themeDatas, screenRect):
margin = themeDatas["Foreground/Margin"]
x = 0
y = margin
width = min(themeDatas["Foreground/Width"], screenRect.width() - 2 * margin)
height = screenRect.height() - 2 * margin
if themeDatas["Foreground/Position"] == 0: # Left
x = margin
elif themeDatas["Foreground/Position"] == 1: # Center
x = (screenRect.width() - width) / 2
elif themeDatas["Foreground/Position"] == 2: # Right
x = screenRect.width() - margin - width
elif themeDatas["Foreground/Position"] == 3: # Stretched
x = margin
width = screenRect.width() - 2 * margin
return QRect(x, y, width, height)
def createThemePreview(theme, screenRect, size=QSize(200, 120)):
if type(theme) == str and os.path.exists(theme):
# Theme is the path to an ini file
themeDatas = loadThemeDatas(theme)
else:
themeDatas = theme
pixmap = generateTheme(themeDatas, screenRect)
px = QPixmap(pixmap).scaled(size, Qt.KeepAspectRatio)
w = px.width() / 10
h = px.height() / 10
r = themeTextRect(themeDatas, screenRect)
painter = QPainter(px)
painter.drawPixmap(QRect(w, h, w*4, h*5), pixmap, QRect(r.topLeft() - QPoint(w/3, h/3), QSize(w*4, h*5)))
painter.setPen(Qt.white)
painter.drawRect(QRect(w, h, w*4, h*5))
painter.end()
return px
def generateTheme(themeDatas, screenRect):
# Window Background
px = QPixmap(screenRect.size())
px.fill(QColor(themeDatas["Background/Color"]))
painter = QPainter(px)
if themeDatas["Background/ImageFile"]:
path = findBackground(themeDatas["Background/ImageFile"])
_type = themeDatas["Background/Type"]
if path and _type > 0:
if _type == 1: # Tiled
painter.fillRect(screenRect, QBrush(QImage(path)))
else:
img = QImage(path)
scaled = img.size()
if _type == 3: # Stretched
scaled.scale(screenRect.size(), Qt.IgnoreAspectRatio)
elif _type == 4: # Scaled
scaled.scale(screenRect.size(), Qt.KeepAspectRatio)
elif _type == 5: # Zoomed
scaled.scale(screenRect.size(), Qt.KeepAspectRatioByExpanding)
painter.drawImage((screenRect.width() - scaled.width()) / 2, (screenRect.height() - scaled.height()) / 2, img.scaled(scaled))
# Text Background
textRect = themeTextRect(themeDatas, screenRect)
painter.save()
color = QColor(themeDatas["Foreground/Color"])
color.setAlpha(themeDatas["Foreground/Opacity"] * 255 / 100)
painter.setBrush(color)
painter.setPen(Qt.NoPen)
r = themeDatas["Foreground/Rounding"]
painter.drawRoundedRect(textRect, r, r)
painter.restore()
painter.end()
# Text
previewText = QTextEdit()
previewText.setFrameStyle(QFrame.NoFrame)
previewText.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
previewText.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
previewText.setPlainText(open(appPath("resources/themes/preview.txt")).read())
padding = themeDatas["Foreground/Padding"]
x = textRect.x() + padding
y = textRect.y() + padding + themeDatas["Spacings/ParagraphAbove"]
width = textRect.width() - 2 * padding
height = textRect.height() - 2 * padding - themeDatas["Spacings/ParagraphAbove"]
previewText.setGeometry(x, y, width, height)
p = previewText.palette()
p.setBrush(QPalette.Base, QBrush(px.copy(x, y, width, height)))
p.setColor(QPalette.Text, QColor(themeDatas["Text/Color"]))
p.setColor(QPalette.Highlight, QColor(themeDatas["Text/Color"]))
p.setColor(QPalette.HighlightedText, Qt.black if qGray(QColor(themeDatas["Text/Color"]).rgb()) > 127 else Qt.white)
previewText.setPalette(p)
bf = QTextBlockFormat()
bf.setLineHeight(themeDatas["Spacings/LineSpacing"], QTextBlockFormat.ProportionalHeight)
bf.setTextIndent(themeDatas["Spacings/TabWidth"] * 1 if themeDatas["Spacings/IndendFirstLine"] else 0)
bf.setTopMargin(themeDatas["Spacings/ParagraphAbove"])
bf.setBottomMargin(themeDatas["Spacings/ParagraphBelow"])
b = previewText.document().firstBlock()
cursor = previewText.textCursor()
while b.isValid():
bf2 = b.blockFormat()
bf2.merge(bf)
cursor.setPosition(b.position())
#cursor.setPosition(b.position(), QTextCursor.KeepAnchor)
cursor.setBlockFormat(bf2)
b = b.next()
previewText.setTabStopWidth(themeDatas["Spacings/TabWidth"])
previewText.document().setIndentWidth(themeDatas["Spacings/TabWidth"])
f = QFont()
f.fromString(themeDatas["Text/Font"])
previewText.setFont(f)
previewText.render(px, previewText.pos())
return px
## Text Background
##themeDatas["Foreground/Color"]
##themeDatas["Foreground/Opacity"]
##themeDatas["Foreground/Margin"]
##themeDatas["Foreground/Padding"]
##themeDatas["Foreground/Position"]
##themeDatas["Foreground/Rounding"]
##themeDatas["Foreground/Width"]
## Text Options
##themeDatas["Text/Color"]
##themeDatas["Text/Font"]
#themeDatas["Text/Misspelled"]
## Paragraph Options
##themeDatas["Spacings/IndendFirstLine"]
##themeDatas["Spacings/LineSpacing"]
##themeDatas["Spacings/ParagraphAbove"]
##themeDatas["Spacings/ParagraphBelow"]
##themeDatas["Spacings/TabWidth"]

View file

@ -701,6 +701,7 @@ class Ui_Settings(object):
self.page = QtWidgets.QWidget()
self.page.setObjectName("page")
self.verticalLayout_10 = QtWidgets.QVBoxLayout(self.page)
self.verticalLayout_10.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_10.setObjectName("verticalLayout_10")
self.lblTitleStatus_2 = QtWidgets.QLabel(self.page)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
@ -723,6 +724,7 @@ class Ui_Settings(object):
self.stackedWidgetPage1_3 = QtWidgets.QWidget()
self.stackedWidgetPage1_3.setObjectName("stackedWidgetPage1_3")
self.verticalLayout_12 = QtWidgets.QVBoxLayout(self.stackedWidgetPage1_3)
self.verticalLayout_12.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_12.setObjectName("verticalLayout_12")
self.lstThemes = QtWidgets.QListWidget(self.stackedWidgetPage1_3)
self.lstThemes.setMovement(QtWidgets.QListView.Static)
@ -755,6 +757,7 @@ class Ui_Settings(object):
self.stackedWidgetPage2_3 = QtWidgets.QWidget()
self.stackedWidgetPage2_3.setObjectName("stackedWidgetPage2_3")
self.verticalLayout_13 = QtWidgets.QVBoxLayout(self.stackedWidgetPage2_3)
self.verticalLayout_13.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_13.setObjectName("verticalLayout_13")
self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
self.horizontalLayout_10.setObjectName("horizontalLayout_10")
@ -1076,7 +1079,7 @@ class Ui_Settings(object):
self.retranslateUi(Settings)
self.stack.setCurrentIndex(4)
self.tabViews.setCurrentIndex(2)
self.themeStack.setCurrentIndex(0)
self.themeStack.setCurrentIndex(1)
self.themeEditStack.setCurrentIndex(1)
self.lstMenu.currentRowChanged['int'].connect(self.stack.setCurrentIndex)
QtCore.QMetaObject.connectSlotsByName(Settings)

View file

@ -1475,6 +1475,9 @@ text-align:center;</string>
</widget>
<widget class="QWidget" name="page">
<layout class="QVBoxLayout" name="verticalLayout_10">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="lblTitleStatus_2">
<property name="sizePolicy">
@ -1503,10 +1506,13 @@ text-align:center;</string>
<item>
<widget class="QStackedWidget" name="themeStack">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="stackedWidgetPage1_3" native="true">
<layout class="QVBoxLayout" name="verticalLayout_12">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QListWidget" name="lstThemes">
<property name="movement">
@ -1579,6 +1585,9 @@ text-align:center;</string>
</widget>
<widget class="QWidget" name="stackedWidgetPage2_3" native="true">
<layout class="QVBoxLayout" name="verticalLayout_13">
<property name="margin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>