From 4de39ebe0782fbd68b5fcc31e0466e76e145e712 Mon Sep 17 00:00:00 2001 From: tassaron Date: Fri, 16 Jun 2017 20:01:27 -0400 Subject: color component size, position, and gradient options --- components/color.py | 117 +++++++++++- components/color.ui | 521 ++++++++++++++++++++++++++++++++++++---------------- mainwindow.py | 4 +- mainwindow.ui | 4 +- 4 files changed, 477 insertions(+), 169 deletions(-) diff --git a/components/color.py b/components/color.py index fda7376..bb08b53 100644 --- a/components/color.py +++ b/components/color.py @@ -1,6 +1,7 @@ from PIL import Image, ImageDraw from PyQt4 import uic, QtGui, QtCore from PyQt4.QtGui import QColor +from PIL.ImageQt import ImageQt import os from . import __base__ @@ -48,6 +49,26 @@ class Component(__base__.Component): page.lineEdit_color2.textChanged.connect(self.update) page.spinBox_x.valueChanged.connect(self.update) page.spinBox_y.valueChanged.connect(self.update) + page.spinBox_width.valueChanged.connect(self.update) + page.spinBox_height.valueChanged.connect(self.update) + page.checkBox_trans.stateChanged.connect(self.update) + + self.fillLabels = [ \ + 'Solid', + 'Linear Gradient', + 'Radial Gradient', + ] + for label in self.fillLabels: + page.comboBox_fill.addItem(label) + page.comboBox_fill.setCurrentIndex(0) + page.comboBox_fill.currentIndexChanged.connect(self.update) + page.spinBox_radialGradient_end.valueChanged.connect(self.update) + page.spinBox_radialGradient_start.valueChanged.connect(self.update) + page.spinBox_radialGradient_spread.valueChanged.connect(self.update) + page.spinBox_linearGradient_end.valueChanged.connect(self.update) + page.spinBox_linearGradient_start.valueChanged.connect(self.update) + page.checkBox_stretch.stateChanged.connect(self.update) + self.page = page return page @@ -56,6 +77,30 @@ class Component(__base__.Component): self.color2 = self.RGBFromString(self.page.lineEdit_color2.text()) self.x = self.page.spinBox_x.value() self.y = self.page.spinBox_y.value() + self.sizeWidth = self.page.spinBox_width.value() + self.sizeHeight = self.page.spinBox_height.value() + self.trans = self.page.checkBox_trans.isChecked() + + self.RG_start = self.page.spinBox_radialGradient_start.value() + self.RG_end = self.page.spinBox_radialGradient_end.value() + self.RG_spread = self.page.spinBox_radialGradient_spread.value() + self.stretch = self.page.checkBox_stretch.isChecked() + self.LG_start = self.page.spinBox_linearGradient_start.value() + self.LG_end = self.page.spinBox_linearGradient_end.value() + + self.fillType = self.page.comboBox_fill.currentIndex() + if self.fillType == 0: + self.page.lineEdit_color2.setEnabled(False) + self.page.pushButton_color2.setEnabled(False) + self.page.checkBox_trans.setEnabled(False) + self.page.checkBox_stretch.setEnabled(False) + else: + self.page.lineEdit_color2.setEnabled(True) + self.page.pushButton_color2.setEnabled(True) + self.page.checkBox_trans.setEnabled(True) + self.page.checkBox_stretch.setEnabled(True) + self.page.fillWidget.setCurrentIndex(self.fillType) + self.parent.drawPreview() super().update() @@ -75,23 +120,77 @@ class Component(__base__.Component): def drawFrame(self, width, height): r, g, b = self.color1 - return Image.new("RGBA", (width, height), (r, g, b, 255)) + shapeSize = (self.sizeWidth, self.sizeHeight) + # in default state, skip all this logic and return a plain fill + if self.fillType==0 and shapeSize == (width, height) \ + and self.x == 0 and self.y == 0: + return Image.new("RGBA", (width, height), (r, g, b, 255)) + + frame = self.blankFrame(width, height) + + # Return a solid image at x, y + if self.fillType == 0: + image = Image.new("RGBA", shapeSize, (r, g, b, 255)) + frame.paste(image, box=(self.x, self.y)) + return frame + + # Now fills that require using Qt... + elif self.fillType > 0: + image = ImageQt(frame) + painter = QtGui.QPainter(image) + if self.stretch: + w = width; h = height + else: + w = self.sizeWidth; h = self.sizeWidth + + if self.fillType == 1: # Linear Gradient + brush = QtGui.QLinearGradient( + self.LG_start, + self.LG_end, + w, h) + + elif self.fillType == 2: # Radial Gradient + brush = QtGui.QRadialGradient( + self.RG_start, + self.RG_end, + w, h, + self.RG_spread) + + brush.setColorAt(0.0, QColor(*self.color1)) + if self.trans: + brush.setColorAt(1.0, QColor(0, 0, 0, 0)) + else: + brush.setColorAt(1.0, QColor(*self.color2)) + painter.setBrush(brush) + painter.drawRect(self.x, self.y, + self.sizeWidth, self.sizeHeight) + painter.end() + imBytes = image.bits().asstring(image.numBytes()) + return Image.frombytes('RGBA', (width, height), imBytes) def loadPreset(self, pr, presetName=None): super().loadPreset(pr, presetName) + self.page.comboBox_fill.setCurrentIndex(pr['fillType']) self.page.lineEdit_color1.setText('%s,%s,%s' % pr['color1']) self.page.lineEdit_color2.setText('%s,%s,%s' % pr['color2']) self.page.spinBox_x.setValue(pr['x']) self.page.spinBox_y.setValue(pr['y']) - self.page.lineEdit_color2.setText('%s,%s,%s' % pr['color2']) + self.page.spinBox_width.setValue(pr['width']) + self.page.spinBox_height.setValue(pr['height']) + self.page.checkBox_trans.setChecked(pr['trans']) + + self.page.spinBox_radialGradient_start.setValue(pr['RG_start']) + self.page.spinBox_radialGradient_end.setValue(pr['RG_end']) + self.page.spinBox_radialGradient_spread.setValue(pr['RG_spread']) + self.page.spinBox_linearGradient_start.setValue(pr['LG_start']) + self.page.spinBox_linearGradient_end.setValue(pr['LG_end']) + self.page.checkBox_stretch.setChecked(pr['stretch']) btnStyle1 = "QPushButton { background-color : %s; outline: none; }" \ % QColor(*pr['color1']).name() - btnStyle2 = "QPushButton { background-color : %s; outline: none; }" \ % QColor(*pr['color2']).name() - self.page.pushButton_color1.setStyleSheet(btnStyle1) self.page.pushButton_color2.setStyleSheet(btnStyle2) @@ -102,6 +201,16 @@ class Component(__base__.Component): 'color2': self.color2, 'x': self.x, 'y': self.y, + 'fillType': self.fillType, + 'width': self.sizeWidth, + 'height': self.sizeHeight, + 'trans': self.trans, + 'RG_start': self.RG_start, + 'RG_end': self.RG_end, + 'RG_spread': self.RG_spread, + 'stretch': self.stretch, + 'LG_start': self.LG_start, + 'LG_end': self.LG_end, } def pickColor(self, num): diff --git a/components/color.ui b/components/color.ui index 9ba0649..89375d3 100644 --- a/components/color.ui +++ b/components/color.ui @@ -159,7 +159,7 @@ 0 - + 0 @@ -167,22 +167,78 @@ - Fill + Width + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + + + + 0 + 0 + + + + + 80 + 16777215 + + + + + 0 + 0 + + + + 0 + + + 999999999 + + + 0 + + + + + + + + 0 + 0 + + + + Height + + + + + - + 0 0 + + + 80 + 16777215 + + + + 999999999 + - + Qt::Horizontal @@ -231,32 +287,16 @@ - 0 + -10000 - 999999999 + 10000 0 - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - @@ -284,159 +324,316 @@ 16777215 + + -10000 + - 999999999 + 10000 - - - - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - - 0 - 0 - - - - Width - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - 0 - 0 - - - - - 80 - 16777215 - - - - - 0 - 0 - - - - 0 - - - 999999999 - - + + 0 - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - - 0 - 0 - - - - Height - - + + + + + 0 + 0 + + + + Fill + + + + + + + + 0 + 0 + + + + -1 + + + QComboBox::AdjustToContentsOnFirstShow + + + + + + + + 0 + 0 + + + + Transparent + + + + + + + + 0 + 0 + + + + Stretch + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 20 + + + + + - - - - 0 - 0 - - - - - 80 - 16777215 - - - - 999999999 - - + + + + + + 0 + 0 + + + + 0 + + + 2 + + + + + + + -1 + 0 + 561 + 31 + + + + + + + + 0 + 0 + + + + Start + + + + + + + -10000 + + + 10000 + + + 10 + + + + + + + + 0 + 0 + + + + End + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -10000 + + + 10000 + + + 10 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + -1 + -1 + 561 + 31 + + + + + + + + 0 + 0 + + + + Start + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -10000 + + + 10000 + + + 10 + + + + + + + + 0 + 0 + + + + End + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -10000 + + + 10000 + + + 10 + + + + + + + + 0 + 0 + + + + Spread + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + QAbstractSpinBox::PlusMinus + + + 1 + + + 20 + + + 3 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + - - - - Qt::Vertical - - - - 20 - 40 - - - - diff --git a/mainwindow.py b/mainwindow.py index fb9ebfd..0d6b130 100644 --- a/mainwindow.py +++ b/mainwindow.py @@ -301,7 +301,9 @@ class MainWindow(QtCore.QObject): def autosaveExists(self): if self.currentProject and os.path.exists(self.autosavePath) \ and filecmp.cmp(self.autosavePath, self.currentProject): - return True + with open(self.autosavePath, 'r') as f: + p = [line for line in f] + return True if len(p) > 1 else False else: return False diff --git a/mainwindow.ui b/mainwindow.ui index e892959..4a12fd5 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 1028 - 592 + 1008 + 575 -- cgit v1.2.3