def __init__(self, win, site):
        UndoableEditor.__init__(self)
        self.win = win
        self.site = site
        self.title = QLineEdit()
        self.titleLabel.setText(QCoreApplication.translate("SiteSettingsEditor", "Site Settings"))
        self.filename = site.source_path + "/" + site.filename
        self.description = QLineEdit()
        self.copyright = QLineEdit()
        self.keywords = QLineEdit()
        self.author = QLineEdit()
        self.output = QLineEdit()
        self.logo = QLineEdit()
        seekButton = QPushButton("...")
        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))
        self.copyright.setPlaceholderText("&copy 2019 your name")
        self.publisher = QComboBox()

        for key in Plugins.publishPluginNames():
            pi = Plugins.getPublishPlugin(key)
            if pi:
                self.publisher.addItem(pi.display_name, key)

        vbox = QVBoxLayout()
        vbox.addStretch()

        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Title")), 1, 0)
        self.layout.addWidget(self.title, 2, 0)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Description")), 3, 0)
        self.layout.addWidget(self.description, 4, 0, 1, 3)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Copyright")), 5, 0)
        self.layout.addWidget(self.copyright, 6, 0, 1, 3)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Keywords")), 7, 0)
        self.layout.addWidget(self.keywords, 8, 0, 1, 3)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Author")), 9, 0)
        self.layout.addWidget(self.author, 10, 0)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Output directory (relative to to source dir)")), 11, 0)
        self.layout.addWidget(self.output, 12, 0)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Logo")), 13, 0)
        self.layout.addWidget(self.logo, 14, 0)
        self.layout.addWidget(seekButton, 14, 1)
        self.layout.addWidget(self.image, 15, 0, 1, 2)
        self.layout.setRowStretch(15, 1)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Plugin to be used for publishing")), 16, 0)
        self.layout.addWidget(self.publisher, 17, 0)
        self.layout.addLayout(vbox, 18, 0)

        self.load()

        self.title.editingFinished.connect(self.titleChanged)
        self.description.editingFinished.connect(self.descriptionChanged)
        self.copyright.editingFinished.connect(self.copyrightChanged)
        self.keywords.editingFinished.connect(self.keywordsChanged)
        self.author.editingFinished.connect(self.authorChanged)
        self.output.editingFinished.connect(self.outputChanged)
        self.logo.editingFinished.connect(self.logoChanged)
        self.publisher.currentIndexChanged.connect(self.publisherChanged)
        seekButton.clicked.connect(self.seek)
示例#2
0
    def __init__(self, win):
        QWidget.__init__(self)
        self.win = win
        self.id = 0
        title = QLabel("Client Data")
        fnt = title.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        title.setFont(fnt)
        self.layout = QGridLayout()
        self.layout.setColumnStretch(0, 1)
        self.number = QLineEdit()
        self.name = QLineEdit()
        self.email = QLineEdit()
        self.profession = QLineEdit()
        self.address = QLineEdit()
        self.mobile = QLineEdit()
        self.notes = QTextEdit()
        self.birthday = QDateEdit()
        self.birthday.setCalendarPopup(True)
        self.birthday.setDisplayFormat("dd.MM.yyyy")

        self.image = ImageSelector()
        self.image.setMinimumWidth(250)

        self.layout.addWidget(title, 0, 0, 1, 2)
        self.layout.addWidget(QLabel("Id"), 1, 0)
        self.layout.addWidget(self.number, 2, 0)

        self.layout.addWidget(QLabel("Name"), 3, 0)
        self.layout.addWidget(self.name, 4, 0)
        self.layout.addWidget(QLabel("Address"), 5, 0)
        self.layout.addWidget(self.address, 6, 0)
        self.layout.addWidget(QLabel("Email"), 7, 0)
        self.layout.addWidget(self.email, 8, 0)
        self.layout.addWidget(QLabel("Mobile"), 9, 0)
        self.layout.addWidget(self.mobile, 10, 0)
        self.layout.addWidget(QLabel("Profession"), 11, 0)
        self.layout.addWidget(self.profession, 12, 0)
        self.layout.addWidget(QLabel("Notes"), 17, 0)
        self.layout.addWidget(self.notes, 18, 0, 1, 2)
        self.layout.addWidget(self.image, 2, 1, 7, 1)
        self.layout.addWidget(QLabel("Birhday"), 9, 1)
        self.layout.addWidget(self.birthday, 10, 1)
        self.setLayout(self.layout)

        self.reload()
        self.number.textEdited.connect(self.clientChanged)
        self.name.textEdited.connect(self.clientChanged)
        self.address.textEdited.connect(self.clientChanged)
        self.email.textEdited.connect(self.clientChanged)
        self.mobile.textEdited.connect(self.clientChanged)
        self.profession.textEdited.connect(self.clientChanged)
        self.notes.textChanged.connect(self.clientChanged)
        self.birthday.dateChanged.connect(self.clientChanged)
        self.image.clicked.connect(self.seek)
    def __init__(self):
        super().__init__()
        self.changed = False
        self.setAutoFillBackground(True)
        grid = QGridLayout()

        seek = QPushButton("...")
        seek.setMaximumWidth(50)
        self.adminlabel = QLineEdit()
        self.adminlabel.setMaximumWidth(200)
        titleLabel = QLabel("Slide")
        fnt = titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        titleLabel.setFont(fnt)
        self.source = QLineEdit()
        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))

        close = FlatButton(":/images/close_normal.png",
                           ":/images/close_hover.png")
        close.setToolTip("Close Editor")

        font = QFont()
        font.setFamily("Courier")
        font.setFixedPitch(True)
        font.setPointSize(13)
        self.innerHtml = QTextEdit()
        self.innerHtml.setMaximumHeight(120)
        self.innerHtml.setFont(font)
        self.innerHtml.setAcceptRichText(False)
        self.innerHtml.setLineWrapMode(QTextEdit.NoWrap)
        metrics = QFontMetrics(font)
        self.innerHtml.setTabStopWidth(4 * metrics.width(' '))
        XmlHighlighter(self.innerHtml.document())

        grid.addWidget(titleLabel, 0, 0)
        grid.addWidget(close, 0, 2, 1, 1, Qt.AlignRight)
        grid.addWidget(QLabel("Path"), 1, 0)
        grid.addWidget(self.source, 2, 0, 1, 2)
        grid.addWidget(seek, 2, 2)
        grid.addWidget(self.image, 3, 0, 1, 2)
        grid.setRowStretch(3, 1)
        grid.addWidget(QLabel("Inner HTML"), 4, 0)
        grid.addWidget(self.innerHtml, 5, 0, 1, 3)
        grid.addWidget(QLabel("Admin Label"), 6, 0)
        grid.addWidget(self.adminlabel, 7, 0)
        self.setLayout(grid)

        close.clicked.connect(self.closeEditor)
        self.image.clicked.connect(self.seek)
        seek.clicked.connect(self.seek)
        self.source.textChanged.connect(self.contentChanged)
        self.adminlabel.textChanged.connect(self.contentChanged)
        self.innerHtml.textChanged.connect(self.contentChanged)
示例#4
0
    def addTableCellButtons(self, item, twi):
        tcb = MenuEditorTableCellButtons()
        tcb.setMenuItem(item)
        self.tree.setItemWidget(twi, 3, tcb)
        self.tree.setColumnWidth(3, tcb.sizeHint().width())
        if item.isSubitem():
            tcb.deleteItem.connect(self.deleteSubItem)
            tcb.itemLeft.connect(self.itemLeft)
        else:
            tcb.deleteItem.connect(self.deleteItem)
            tcb.itemUp.connect(self.itemUp)
            tcb.itemDown.connect(self.itemDown)
            tcb.itemRight.connect(self.itemRight)
            tcb.editItem.connect(self.editItem)

        imgs = ImageSelector()
        imgs.setToolTip("Click to select image, right click to reset image")
        imgs.setItem(item)
        imgs.setMaximumSize(24, 24)
        isw = QWidget()
        vbox = QVBoxLayout()
        vbox.addWidget(imgs)
        isw.setLayout(vbox)
        if not item.icon:
            imgs.setImage(QImage(":/images/image_placeholder.png"))
        else:
            imgs.setImage(QImage(self.site.source_path + "/" + item.icon))
        self.tree.setItemWidget(twi, 2, isw)
        imgs.clicked.connect(self.iconClicked)
    def __init__(self):
        ElementEditorInterface.__init__(self)
        self.site = None
        self.animation = ""
        self.class_name = "ImageEditor"
        self.display_name = QCoreApplication.translate("ImageEditor", "Image")
        self.tag_name = "Image"
        self.version = "1.0"
        self.icon = QImage(":/imageeditor.png")

        self.changed = False
        self.setAutoFillBackground(True)

        grid = QGridLayout()

        self.source = QLineEdit()
        self.alt = QLineEdit()
        self.alt.setMaximumWidth(200)
        self.title = QLineEdit()
        self.title.setMaximumWidth(200)
        self.link = QLineEdit()
        self.link.setMaximumWidth(200)
        self.adminlabel = QLineEdit()
        self.adminlabel.setMaximumWidth(200)
        seek = QPushButton("...")
        seek.setMaximumWidth(50)
        titleLabel = QLabel(
            QCoreApplication.translate("ImageEditor", "Image Module"))
        fnt = titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        titleLabel.setFont(fnt)
        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))

        close = FlatButton(":/images/close_normal.png",
                           ":/images/close_hover.png")
        close.setToolTip(QCoreApplication.translate("general", "Close Editor"))

        self.animation_type = QListWidget()
        self.animation_type.addItem("None")
        self.animation_type.addItem("Attention Seekers")
        self.animation_type.addItem("Bouncing Entrances")
        self.animation_type.addItem("Bouncing Exits")
        self.animation_type.addItem("Fading Entrances")
        self.animation_type.addItem("Fading Exits")
        self.animation_type.addItem("Flippers")
        self.animation_type.addItem("Rotating Entrances")
        self.animation_type.addItem("Rotating Exits")
        self.animation_type.addItem("Sliding Entrances")
        self.animation_type.addItem("Sliding Exits")
        self.animation_type.addItem("Zoom Entrances")
        self.animation_type.addItem("Zoom Exits")

        self.animation_subtype = QListWidget()

        grid.addWidget(titleLabel, 0, 0)
        grid.addWidget(close, 0, 3, 1, 1, Qt.AlignRight)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Path")), 1, 0)
        grid.addWidget(self.source, 2, 0, 1, 3)
        grid.addWidget(seek, 2, 3)
        grid.addWidget(self.image, 3, 0, 1, 4)
        grid.setRowStretch(3, 1)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Alt")), 6, 0)
        grid.addWidget(self.alt, 7, 0)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Title")), 8, 0)
        grid.addWidget(self.title, 9, 0)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Hyperlink")), 10,
            0)
        grid.addWidget(self.link, 11, 0)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Animation")), 6,
            1)
        grid.addWidget(self.animation_type, 7, 1, 8, 1)
        grid.addWidget(self.animation_subtype, 7, 2, 8, 1)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Admin Label")),
            13, 0)
        grid.addWidget(self.adminlabel, 14, 0)
        self.setLayout(grid)

        close.clicked.connect(self.closeEditor)
        self.source.textChanged.connect(self.contentChanged)
        self.alt.textChanged.connect(self.contentChanged)
        self.title.textChanged.connect(self.contentChanged)
        self.link.textChanged.connect(self.contentChanged)
        self.adminlabel.textChanged.connect(self.contentChanged)
        seek.clicked.connect(self.seek)
        self.image.clicked.connect(self.seek)
        self.animation_type.currentTextChanged.connect(
            self.animationTypeChanged)
        self.animation_subtype.currentTextChanged.connect(self.contentChanged)
class ImageEditor(ElementEditorInterface):
    def __init__(self):
        ElementEditorInterface.__init__(self)
        self.site = None
        self.animation = ""
        self.class_name = "ImageEditor"
        self.display_name = QCoreApplication.translate("ImageEditor", "Image")
        self.tag_name = "Image"
        self.version = "1.0"
        self.icon = QImage(":/imageeditor.png")

        self.changed = False
        self.setAutoFillBackground(True)

        grid = QGridLayout()

        self.source = QLineEdit()
        self.alt = QLineEdit()
        self.alt.setMaximumWidth(200)
        self.title = QLineEdit()
        self.title.setMaximumWidth(200)
        self.link = QLineEdit()
        self.link.setMaximumWidth(200)
        self.adminlabel = QLineEdit()
        self.adminlabel.setMaximumWidth(200)
        seek = QPushButton("...")
        seek.setMaximumWidth(50)
        titleLabel = QLabel(
            QCoreApplication.translate("ImageEditor", "Image Module"))
        fnt = titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        titleLabel.setFont(fnt)
        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))

        close = FlatButton(":/images/close_normal.png",
                           ":/images/close_hover.png")
        close.setToolTip(QCoreApplication.translate("general", "Close Editor"))

        self.animation_type = QListWidget()
        self.animation_type.addItem("None")
        self.animation_type.addItem("Attention Seekers")
        self.animation_type.addItem("Bouncing Entrances")
        self.animation_type.addItem("Bouncing Exits")
        self.animation_type.addItem("Fading Entrances")
        self.animation_type.addItem("Fading Exits")
        self.animation_type.addItem("Flippers")
        self.animation_type.addItem("Rotating Entrances")
        self.animation_type.addItem("Rotating Exits")
        self.animation_type.addItem("Sliding Entrances")
        self.animation_type.addItem("Sliding Exits")
        self.animation_type.addItem("Zoom Entrances")
        self.animation_type.addItem("Zoom Exits")

        self.animation_subtype = QListWidget()

        grid.addWidget(titleLabel, 0, 0)
        grid.addWidget(close, 0, 3, 1, 1, Qt.AlignRight)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Path")), 1, 0)
        grid.addWidget(self.source, 2, 0, 1, 3)
        grid.addWidget(seek, 2, 3)
        grid.addWidget(self.image, 3, 0, 1, 4)
        grid.setRowStretch(3, 1)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Alt")), 6, 0)
        grid.addWidget(self.alt, 7, 0)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Title")), 8, 0)
        grid.addWidget(self.title, 9, 0)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Hyperlink")), 10,
            0)
        grid.addWidget(self.link, 11, 0)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Animation")), 6,
            1)
        grid.addWidget(self.animation_type, 7, 1, 8, 1)
        grid.addWidget(self.animation_subtype, 7, 2, 8, 1)
        grid.addWidget(
            QLabel(QCoreApplication.translate("ImageEditor", "Admin Label")),
            13, 0)
        grid.addWidget(self.adminlabel, 14, 0)
        self.setLayout(grid)

        close.clicked.connect(self.closeEditor)
        self.source.textChanged.connect(self.contentChanged)
        self.alt.textChanged.connect(self.contentChanged)
        self.title.textChanged.connect(self.contentChanged)
        self.link.textChanged.connect(self.contentChanged)
        self.adminlabel.textChanged.connect(self.contentChanged)
        seek.clicked.connect(self.seek)
        self.image.clicked.connect(self.seek)
        self.animation_type.currentTextChanged.connect(
            self.animationTypeChanged)
        self.animation_subtype.currentTextChanged.connect(self.contentChanged)

    def animationTypeChanged(self, type):
        self.contentChanged()
        self.animation_subtype.clear()
        if type == "Attention Seekers":
            self.addSubItem("Bounce", "bounce")
            self.addSubItem("Flash", "flash")
            self.addSubItem("Pulse", "pulse")
            self.addSubItem("Shake", "shake")
            self.addSubItem("Swing", "swing")
            self.addSubItem("Tada", "tada")
            self.addSubItem("Wobble", "wobble")
        elif type == "Bouncing Entrances":
            self.addSubItem("Bounce In", "bounceIn")
            self.addSubItem("Bounce In Down", "bounceInDown")
            self.addSubItem("Bounce In Left", "bounceInLeft")
            self.addSubItem("Bounce In Right", "bounceInRight")
            self.addSubItem("Bounce In Up", "bounceInUp")
        elif type == "Bouncing Exits":
            self.addSubItem("Bounce Out", "bounceOut")
            self.addSubItem("Bounce Out Down", "bounceOutDown")
            self.addSubItem("Bounce Out Left", "bounceOutLeft")
            self.addSubItem("Bounce Out Right", "bounceOutRight")
            self.addSubItem("Bounce Out Up", "bounceOutUp")
        elif type == "Fading Entrances":
            self.addSubItem("Fade In", "fadeIn")
            self.addSubItem("Fade In Down", "fadeInDown")
            self.addSubItem("Fade In Down Big", "fadeInDownBig")
            self.addSubItem("Fade In Left", "fadeInLeft")
            self.addSubItem("Fade In Left Big", "fadeInLeftBig")
            self.addSubItem("Fade In Right", "fadeInRight")
            self.addSubItem("Fade In Right Big", "fadeInRightBig")
            self.addSubItem("Fade In Up", "fadeInUp")
            self.addSubItem("Fade In Up Big", "fadeInUpBig")
        elif type == "Fading Exits":
            self.addSubItem("Fade Out", "fadeOut")
            self.addSubItem("Fade Out Down", "fadeOutDown")
            self.addSubItem("Fade Out Down Big", "fadeOutDownBig")
            self.addSubItem("Fade Out Left", "fadeOutLeft")
            self.addSubItem("Fade Out Left Big", "fadeOutLeftBig")
            self.addSubItem("Fade Out Right", "fadeOutRight")
            self.addSubItem("Fade Out Right Big", "fadeOutRightBig")
            self.addSubItem("Fade Out Up", "fadeOutUp")
            self.addSubItem("Fade Out Up Big", "fadeOutUpBig")
        elif type == "Flippers":
            self.addSubItem("Flip", "flip")
            self.addSubItem("Flip In X", "flipInX")
            self.addSubItem("Flip In Y", "flipInY")
            self.addSubItem("Flip Out X", "flipOutX")
            self.addSubItem("Flip Out Y", "flipOutY")
        elif type == "Rotating Entrances":
            self.addSubItem("Rotate In", "rotateIn")
            self.addSubItem("Rotate In Down Left", "rotateInDownLeft")
            self.addSubItem("Rotate In Down Right", "rotateInDownRight")
            self.addSubItem("Rotate In Up Left", "rotateInUpLeft")
            self.addSubItem("Rotate In Up Right", "rotateInUpRight")
        elif type == "Rotating Exits":
            self.addSubItem("Rotate Out", "rotateOut")
            self.addSubItem("Rotate Out Down Left", "rotateOutDownLeft")
            self.addSubItem("Rotate Out Down Right", "rotateOutDownRight")
            self.addSubItem("Rotate Out Up Left", "rotateOutUpLeft")
            self.addSubItem("Rotate Out Up Right", "rotateOutUpRight")
        elif type == "Sliding Entrances":
            self.addSubItem("Slide In Up", "slideInUp")
            self.addSubItem("Slide In Down", "slideInDown")
            self.addSubItem("Slide In Left", "slideInLeft")
            self.addSubItem("Slide In Right", "slideInRight")
        elif type == "Sliding Exits":
            self.addSubItem("Slide Out Up", "slideOutUp")
            self.addSubItem("Slide Out Down", "slideOutDown")
            self.addSubItem("Slide Out Left", "slideOutLeft")
            self.addSubItem("Slide Out Right", "slideOutRight")
        elif type == "Zoom Entrances":
            self.addSubItem("Zoom In", "zoomIn")
            self.addSubItem("Zoom In Down", "zoomInDown")
            self.addSubItem("Zoom In Left", "zoomInLeft")
            self.addSubItem("Zoom In Right", "zoomInRight")
            self.addSubItem("Zoom In Up", "zoomInUp")
        elif type == "Zoom Exits":
            self.addSubItem("Zoom Out", "zoomOut")
            self.addSubItem("Zoom Out Down", "zoomOutDown")
            self.addSubItem("Zoom Out Left", "zoomOutLeft")
            self.addSubItem("Zoom Out Right", "zoomOutRight")
            self.addSubItem("Zoom Out Up", "zoomOutUp")

    def addSubItem(self, title, data):
        item = QListWidgetItem(title)
        item.setData(Qt.UserRole, data)
        self.animation_subtype.addItem(item)

    def closeEditor(self):
        if self.changed:
            self.content.src = self.source.text()
            self.content.alt = self.alt.text()
            self.content.title = self.title.text()
            self.content.link = self.link.text()
            self.content.adminlabel = self.adminlabel.text()
            if self.animation_type.currentItem():
                self.content.animation_type = self.animation_type.currentItem(
                ).data(Qt.DisplayRole)
            if self.animation_subtype.currentItem():
                self.content.animation = self.animation_subtype.currentItem(
                ).data(Qt.UserRole)
            else:
                self.content.animation = ""
            #foreach(QString attName, m_attributes.keys())
            #{
            #    stream.writeAttribute(attName, m_attributes.value(attName))
            #}
        self.close.emit()

    def getDefaultContent(self):
        return Image()

    def setContent(self, content):
        self.content = content
        self.source.setText(content.src)
        self.alt.setText(content.alt)
        self.title.setText(content.title)
        self.link.setText(content.link)
        self.adminlabel.setText(content.adminlabel)
        if content.src:
            self.image.setImage(
                QImage(
                    os.path.join(self.site.source_path, "assets", "images",
                                 content.src)))
        if self.animation_type:
            index = self.findData(self.animation_type, content.animation_type,
                                  Qt.DisplayRole)
            self.animation_type.setCurrentRow(index)
            if self.animation_subtype:
                index = self.findData(self.animation_subtype,
                                      content.animation, Qt.UserRole)
                self.animation_subtype.setCurrentRow(index)
        else:
            self.animation_type.setCurrentRow(0)
        self.changed = False

    def findData(self, list, value, role):
        if not value:
            return -1
        for index in range(list.count()):
            item = list.item(index)
            if item.data(role) == value:
                return index
        return -1

    def getContent(self):
        return self.content

    def seek(self):
        fileName = ""
        dialog = QFileDialog()
        dialog.setFileMode(QFileDialog.AnyFile)
        dialog.setNameFilter(
            QCoreApplication.translate("ImageEditor", "Images") +
            " (*.png *.gif *.jpg)All (*)")
        dialog.setWindowTitle(
            QCoreApplication.translate("ImageEditor", "Load Image"))
        dialog.setOption(QFileDialog.DontUseNativeDialog, True)
        dialog.setAcceptMode(QFileDialog.AcceptOpen)
        if dialog.exec():
            fileName = dialog.selectedFiles()[0]
        del dialog
        if not fileName:
            return

        # copy file to assets dir
        name = os.path.basename(fileName).replace(" ", "_")
        path = os.path.join(self.site.source_path, "assets", "images", name)
        self.source.setText(os.path.basename(path))
        try:
            shutil.copy(fileName, path)
        except shutil.SameFileError:
            pass

        # also copy file to deploy dir for previews
        dpath = os.path.join(self.site.source_path, self.site.output, "assets",
                             "images", name)
        try:
            shutil.copy(fileName, dpath)
        except shutil.SameFileError:
            pass

        self.image.setImage(QImage(path))
        self.contentChanged()

    def registerContenType(self):
        qmlRegisterType(Image, 'ImageEditor', 1, 0, 'Image')

    def getImportString(self):
        return "import ImageEditor 1.0\n"

    def pluginStyles(self):
        return "<link href=\"assets/plugins/animate/animate.css\" rel=\"stylesheet\" type=\"text/css\"/>\n"

    def installAssets(self, assets_path):
        assets = QDir(assets_path)
        assets.mkdir("plugins")
        assets.cd("plugins")
        assets.mkdir("animate")
        dst = os.path.join(assets_path, "plugins", "animate", "animate.css")
        QFile.copy(":/animate.css", dst)
        os.chmod(
            dst, stat.S_IWRITE | stat.S_IREAD | stat.S_IWGRP | stat.S_IRGRP
            | stat.S_IROTH)
class SiteSettingsEditor(UndoableEditor):
    def __init__(self, win, site):
        UndoableEditor.__init__(self)
        self.win = win
        self.site = site
        self.title = QLineEdit()
        self.titleLabel.setText(QCoreApplication.translate("SiteSettingsEditor", "Site Settings"))
        self.filename = site.source_path + "/" + site.filename
        self.description = QLineEdit()
        self.copyright = QLineEdit()
        self.keywords = QLineEdit()
        self.author = QLineEdit()
        self.output = QLineEdit()
        self.logo = QLineEdit()
        seekButton = QPushButton("...")
        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))
        self.copyright.setPlaceholderText("&copy 2019 your name")
        self.publisher = QComboBox()

        for key in Plugins.publishPluginNames():
            pi = Plugins.getPublishPlugin(key)
            if pi:
                self.publisher.addItem(pi.display_name, key)

        vbox = QVBoxLayout()
        vbox.addStretch()

        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Title")), 1, 0)
        self.layout.addWidget(self.title, 2, 0)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Description")), 3, 0)
        self.layout.addWidget(self.description, 4, 0, 1, 3)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Copyright")), 5, 0)
        self.layout.addWidget(self.copyright, 6, 0, 1, 3)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Keywords")), 7, 0)
        self.layout.addWidget(self.keywords, 8, 0, 1, 3)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Author")), 9, 0)
        self.layout.addWidget(self.author, 10, 0)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Output directory (relative to to source dir)")), 11, 0)
        self.layout.addWidget(self.output, 12, 0)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Logo")), 13, 0)
        self.layout.addWidget(self.logo, 14, 0)
        self.layout.addWidget(seekButton, 14, 1)
        self.layout.addWidget(self.image, 15, 0, 1, 2)
        self.layout.setRowStretch(15, 1)
        self.layout.addWidget(QLabel(QCoreApplication.translate("SiteSettingsEditor", "Plugin to be used for publishing")), 16, 0)
        self.layout.addWidget(self.publisher, 17, 0)
        self.layout.addLayout(vbox, 18, 0)

        self.load()

        self.title.editingFinished.connect(self.titleChanged)
        self.description.editingFinished.connect(self.descriptionChanged)
        self.copyright.editingFinished.connect(self.copyrightChanged)
        self.keywords.editingFinished.connect(self.keywordsChanged)
        self.author.editingFinished.connect(self.authorChanged)
        self.output.editingFinished.connect(self.outputChanged)
        self.logo.editingFinished.connect(self.logoChanged)
        self.publisher.currentIndexChanged.connect(self.publisherChanged)
        seekButton.clicked.connect(self.seek)

    def seek(self):
        fileName = ""
        dialog = QFileDialog()
        dialog.setFileMode(QFileDialog.AnyFile)
        dialog.setNameFilter("Images (*.png *.gif *.jpg);;All (*)")
        dialog.setWindowTitle(QCoreApplication.translate("SiteSettingsEditor", "Load Image"))
        dialog.setOption(QFileDialog.DontUseNativeDialog, True)
        dialog.setAcceptMode(QFileDialog.AcceptOpen)
        if dialog.exec():
            fileName = dialog.selectedFiles()[0]
        del dialog
        if not fileName:
            return

        # copy file to assets dir
        name = os.path.basename(fileName).replace(" ", "_")
        path = os.path.join(self.site.source_path, "assets", "images", name)
        self.logo.setText(os.path.basename(path))
        shutil.copy(fileName, path)

        # also copy file to deploy dir for previews
        dpath = os.path.join(self.site.source_path, self.site.output, "assets", "images", name)
        shutil.copy(fileName, dpath)

        self.image.setImage(QImage(path))
        self.contentChanged("logo changed")

    def load(self):
        oldTitle = self.site.title
        self.title.setText(self.site.title)
        self.description.setText(self.site.description)
        self.copyright.setText(self.site.copyright)
        self.keywords.setText(self.site.keywords)
        self.author.setText(self.site.author)
        self.output.setText(self.site.output)
        self.logo.setText(self.site.logo)
        if self.site.logo:
            self.image.setImage(QImage(os.path.join(self.site.source_path, "assets", "images", self.site.logo)))
        index = self.publisher.findData(self.site.publisher)
        self.publisher.setCurrentIndex(index)
        #if oldTitle != self.site.title:
        #    os.rename(Generator.sitesPath() + "/" + oldTitle, Generator.sitesPath() + "/" + self.site.title)
        #    print("renaming1: " + Generator.sitesPath() + "/" + oldTitle)
        #    self.win.statusBar().showMessage("Site settings have been loaded. Site should be rebuilded. Output path has been renamed to " + self.site.title())

    def save(self):
        if self.site.title != self.title.text():
            oldTitle = self.site.title
            self.site.title = self.title.text()
            self.site.save()
            #os.rename(Generator.sitesPath() + "/" + oldTitle, Generator.sitesPath() + "/" + self.site.title)
            self.win.statusBar().showMessage(QCoreApplication.translate("SiteSettingsEditor", "Site settings have been saved. Site should be rebuilded on the dashboard.") + " " + QCoreApplication.translate("SiteSettingsEditor", "Output path has been renamed to") + " " + self.title.text())
        else:
            self.site.author = self.author.text()
            self.site.output = self.output.text()
            self.site.copyright = self.copyright.text()
            self.site.description = self.description.text()
            self.site.keywords = self.keywords.text()
            self.site.publisher = self.publisher.currentData()
            if not self.site.publisher:
                self.site.publisher = ""
            Plugins.setActualPublishPlugin(self.site.publisher)
            self.site.logo = self.logo.text()
            self.site.save()
            self.win.statusBar().showMessage(QCoreApplication.translate("SiteSettingsEditor", "Site settings have been saved. Site should be rebuilded on the dashboard."))

    def publisherChanged(self, publisher):
        if self.site.publisher != publisher:
            self.contentChanged("publisher changed")

    def titleChanged(self):
        if self.site.title != self.title.text():
            self.contentChanged("title changed")

    def authorChanged(self):
        if self.site.author != self.author.text():
            self.contentChanged("author changed")

    def outputChanged(self):
        if self.site.output != self.output.text():
            self.contentChanged("output changed")

    def logoChanged(self):
        if self.site.logo != self.logo.text():
            self.contentChanged("logo changed")

    def descriptionChanged(self):
        if self.site.description != self.description.text():
            self.contentChanged("description changed")

    def copyrightChanged(self):
        if self.site.copyright != self.copyright.text():
            self.contentChanged("copyright changed")

    def keywordsChanged(self):
        if self.site.keywords != self.keywords.text():
            self.contentChanged("keywords changed")
class SlideEditor(AnimateableEditor):
    def __init__(self):
        super().__init__()
        self.changed = False
        self.setAutoFillBackground(True)
        grid = QGridLayout()

        seek = QPushButton("...")
        seek.setMaximumWidth(50)
        self.adminlabel = QLineEdit()
        self.adminlabel.setMaximumWidth(200)
        titleLabel = QLabel("Slide")
        fnt = titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        titleLabel.setFont(fnt)
        self.source = QLineEdit()
        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))

        close = FlatButton(":/images/close_normal.png",
                           ":/images/close_hover.png")
        close.setToolTip("Close Editor")

        font = QFont()
        font.setFamily("Courier")
        font.setFixedPitch(True)
        font.setPointSize(13)
        self.innerHtml = QTextEdit()
        self.innerHtml.setMaximumHeight(120)
        self.innerHtml.setFont(font)
        self.innerHtml.setAcceptRichText(False)
        self.innerHtml.setLineWrapMode(QTextEdit.NoWrap)
        metrics = QFontMetrics(font)
        self.innerHtml.setTabStopWidth(4 * metrics.width(' '))
        XmlHighlighter(self.innerHtml.document())

        grid.addWidget(titleLabel, 0, 0)
        grid.addWidget(close, 0, 2, 1, 1, Qt.AlignRight)
        grid.addWidget(QLabel("Path"), 1, 0)
        grid.addWidget(self.source, 2, 0, 1, 2)
        grid.addWidget(seek, 2, 2)
        grid.addWidget(self.image, 3, 0, 1, 2)
        grid.setRowStretch(3, 1)
        grid.addWidget(QLabel("Inner HTML"), 4, 0)
        grid.addWidget(self.innerHtml, 5, 0, 1, 3)
        grid.addWidget(QLabel("Admin Label"), 6, 0)
        grid.addWidget(self.adminlabel, 7, 0)
        self.setLayout(grid)

        close.clicked.connect(self.closeEditor)
        self.image.clicked.connect(self.seek)
        seek.clicked.connect(self.seek)
        self.source.textChanged.connect(self.contentChanged)
        self.adminlabel.textChanged.connect(self.contentChanged)
        self.innerHtml.textChanged.connect(self.contentChanged)

    def setSite(self, site):
        self.site = site

    def setSlide(self, slide):
        self.slide = slide
        self.source.setText(slide.src)
        if slide.src:
            self.image.setImage(QImage(slide.src))
        else:
            self.image.setImage(QImage(":/images/image_placeholder.png"))
        self.innerHtml.setPlainText(html.unescape(slide._text))
        self.adminlabel.setText(slide._adminlabel)
        self.changed = False

    def closeEditor(self):
        if self.changed:
            self.slide.src = self.source.text()
            self.slide._text = html.escape(self.innerHtml.toPlainText())
            self.slide._adminlabel = self.adminlabel.text()
        self.closes.emit()

    def seek(self):
        fileName = ""
        dialog = QFileDialog()
        dialog.setFileMode(QFileDialog.AnyFile)
        dialog.setNameFilter("Images (*.png *.gif *.jpg)All (*)")
        dialog.setWindowTitle("Load Image")
        dialog.setOption(QFileDialog.DontUseNativeDialog, True)
        dialog.setAcceptMode(QFileDialog.AcceptOpen)
        if dialog.exec():
            fileName = dialog.selectedFiles()[0]
        if not fileName:
            return

        # copy file to assets dir
        info = QFileInfo(fileName)
        name = info.fileName().replace(" ", "_")
        path = os.path.join(self.site.source_path, "assets", "images", name)
        self.source.setText(path)
        try:
            shutil.copy2(fileName, path)
        except shutil.SameFileError:
            pass  # just ignore
        # also copy file to deploy dir for previews
        dpath = os.path.join(self.site.source_path, self.site.output, "docs",
                             "assets", "images", name)
        shutil.copy2(fileName, dpath)

        self.image.setImage(QImage(path))
        self.contentChanged()
示例#9
0
class SlideEditor(AnimateableEditor):

    def __init__(self):
        super().__init__()
        self.changed = False
        self.setAutoFillBackground(True)

        grid = QGridLayout()

        seek = QPushButton("...")
        seek.setMaximumWidth(50)
        self.adminlabel = QLineEdit()
        self.adminlabel.setMaximumWidth(200)
        titleLabel = QLabel(QCoreApplication.translate("CarouselEditor", "Slide"))
        fnt = titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        titleLabel.setFont(fnt)
        self.source = QLineEdit()
        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))

        close = FlatButton(":/images/close_normal.png", ":/images/close_hover.png")
        close.setToolTip(QCoreApplication.translate("general", "Close Editor"))

        font = QFont()
        font.setFamily("Courier")
        font.setFixedPitch(True)
        font.setPointSize(13)
        self.innerHtml = QTextEdit()
        self.innerHtml.setMaximumHeight(120)
        self.innerHtml.setFont(font)
        self.innerHtml.setAcceptRichText(False)
        self.innerHtml.setLineWrapMode(QTextEdit.NoWrap)
        metrics = QFontMetrics(font)
        self.innerHtml.setTabStopWidth(4 * metrics.width(' '))
        XmlHighlighter(self.innerHtml.document())

        grid.addWidget(titleLabel, 0, 0)
        grid.addWidget(close, 0, 2, 1, 1, Qt.AlignRight)
        grid.addWidget(QLabel(QCoreApplication.translate("CarouselEditor", "Path")), 1, 0)
        grid.addWidget(self.source, 2, 0, 1, 2)
        grid.addWidget(seek, 2, 2)
        grid.addWidget(self.image, 3, 0, 1, 2)
        grid.setRowStretch(3, 1)
        grid.addWidget(QLabel(QCoreApplication.translate("CarouselEditor", "Inner HTML")), 4, 0)
        grid.addWidget(self.innerHtml, 5, 0, 1, 3)
        grid.addWidget(QLabel(QCoreApplication.translate("general", "Admin Label")), 6, 0)
        grid.addWidget(self.adminlabel, 7, 0)
        self.setLayout(grid)

        close.clicked.connect(self.closeEditor)
        #connect(self.image, SIGNAL(clicked()), this, SLOT(seek()))
        #connect(seek, SIGNAL(clicked(bool)), this, SLOT(seek()))
        #connect(self.source, SIGNAL(textChanged(QString)), this, SLOT(contentChanged()))
        #connect(self.adminlabel, SIGNAL(textChanged(QString)), this, SLOT(contentChanged()))
        #connect(self.innerHtml, SIGNAL(textChanged()), this, SLOT(contentChanged()))

    def setSlide(self, slide):
        self.slide = slide
        self.source.setText(slide.src)
        if slide.src:
            self.image.setImage(QImage(slide.src))
        else:
            self.image.setImage(QImage(":/images/image_placeholder.png"))
        self.innerHtml.setPlainText(slide._text)
        self.adminlabel.setText(slide._adminlabel)
        self.changed = False

    def closeEditor(self):
        if self.changed:
            self.slide.setSource(self.source.text())
            self.slide.setInnerHtml(self.innerHtml.toPlainText())
            self.slide.setAdminLabel(self.adminlabel.text())
        self.closes.emit()
示例#10
0
    def __init__(self, win):
        QWidget.__init__(self)
        self.win = win
        self.id = 0
        title = QLabel("Client Data")
        fnt = title.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        title.setFont(fnt)
        self.layout = QGridLayout()
        self.layout.setColumnStretch(0, 1)
        self.number = QLineEdit()
        self.name = QLineEdit()
        self.email = QLineEdit()
        self.profession = QLineEdit()
        self.address = QLineEdit()
        self.mobile = QLineEdit()
        self.reason = QLineEdit()
        self.how = QLineEdit()
        self.fiscal = QLineEdit()
        self.notes = QTextEdit()
        self.birthday = QDateEdit()
        self.birthday.setCalendarPopup(True)
        self.birthday.setDisplayFormat("dd.MM.yyyy")
        self.firstcontact = QDateEdit(QDate.currentDate())
        self.firstcontact.setDisplayFormat("dd.MM.yyyy")
        self.firstcontact.setCalendarPopup(True)

        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))
        self.image.setMinimumWidth(250)

        self.layout.addWidget(title, 0, 0, 1, 2)
        self.layout.addWidget(QLabel("Number"), 1, 0)
        self.layout.addWidget(self.number, 2, 0)

        self.layout.addWidget(QLabel("Name"), 3, 0)
        self.layout.addWidget(self.name, 4, 0)
        self.layout.addWidget(QLabel("Address"), 5, 0)
        self.layout.addWidget(self.address, 6, 0)
        self.layout.addWidget(QLabel("Email"), 7, 0)
        self.layout.addWidget(self.email, 8, 0)
        self.layout.addWidget(QLabel("Mobile"), 9, 0)
        self.layout.addWidget(self.mobile, 10, 0)
        self.layout.addWidget(QLabel("Profession"), 11, 0)
        self.layout.addWidget(self.profession, 12, 0)
        self.layout.addWidget(QLabel("Reason"), 13, 0)
        self.layout.addWidget(self.reason, 14, 0)
        self.layout.addWidget(QLabel("How did you get here?"), 15, 0)
        self.layout.addWidget(self.how, 16, 0)
        self.layout.addWidget(QLabel("Notes"), 17, 0)
        self.layout.addWidget(self.notes, 18, 0, 1, 2)
        self.layout.addWidget(self.image, 2, 1, 7, 1)
        self.layout.addWidget(QLabel("Birhday"), 9, 1)
        self.layout.addWidget(self.birthday, 10, 1)
        self.layout.addWidget(QLabel("First Contact"), 11, 1)
        self.layout.addWidget(self.firstcontact, 12, 1)
        self.layout.addWidget(QLabel("Fiscal"), 13, 1)
        self.layout.addWidget(self.fiscal, 14, 1, 1, 1)
        self.setLayout(self.layout)

        self.reload()
        self.number.textEdited.connect(self.clientChanged)
        self.name.textEdited.connect(self.clientChanged)
        self.address.textEdited.connect(self.clientChanged)
        self.email.textEdited.connect(self.clientChanged)
        self.mobile.textEdited.connect(self.clientChanged)
        self.profession.textEdited.connect(self.clientChanged)
        self.reason.textEdited.connect(self.clientChanged)
        self.how.textEdited.connect(self.clientChanged)
        self.notes.textChanged.connect(self.clientChanged)
        self.fiscal.textEdited.connect(self.clientChanged)
        self.birthday.dateChanged.connect(self.clientChanged)
        self.firstcontact.dateChanged.connect(self.clientChanged)
示例#11
0
class ClientEditor(QWidget):
    def __init__(self, win):
        QWidget.__init__(self)
        self.win = win
        self.id = 0
        title = QLabel("Client Data")
        fnt = title.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        title.setFont(fnt)
        self.layout = QGridLayout()
        self.layout.setColumnStretch(0, 1)
        self.number = QLineEdit()
        self.name = QLineEdit()
        self.email = QLineEdit()
        self.profession = QLineEdit()
        self.address = QLineEdit()
        self.mobile = QLineEdit()
        self.reason = QLineEdit()
        self.how = QLineEdit()
        self.fiscal = QLineEdit()
        self.notes = QTextEdit()
        self.birthday = QDateEdit()
        self.birthday.setCalendarPopup(True)
        self.birthday.setDisplayFormat("dd.MM.yyyy")
        self.firstcontact = QDateEdit(QDate.currentDate())
        self.firstcontact.setDisplayFormat("dd.MM.yyyy")
        self.firstcontact.setCalendarPopup(True)

        self.image = ImageSelector()
        self.image.setImage(QImage(":/images/image_placeholder.png"))
        self.image.setMinimumWidth(250)

        self.layout.addWidget(title, 0, 0, 1, 2)
        self.layout.addWidget(QLabel("Number"), 1, 0)
        self.layout.addWidget(self.number, 2, 0)

        self.layout.addWidget(QLabel("Name"), 3, 0)
        self.layout.addWidget(self.name, 4, 0)
        self.layout.addWidget(QLabel("Address"), 5, 0)
        self.layout.addWidget(self.address, 6, 0)
        self.layout.addWidget(QLabel("Email"), 7, 0)
        self.layout.addWidget(self.email, 8, 0)
        self.layout.addWidget(QLabel("Mobile"), 9, 0)
        self.layout.addWidget(self.mobile, 10, 0)
        self.layout.addWidget(QLabel("Profession"), 11, 0)
        self.layout.addWidget(self.profession, 12, 0)
        self.layout.addWidget(QLabel("Reason"), 13, 0)
        self.layout.addWidget(self.reason, 14, 0)
        self.layout.addWidget(QLabel("How did you get here?"), 15, 0)
        self.layout.addWidget(self.how, 16, 0)
        self.layout.addWidget(QLabel("Notes"), 17, 0)
        self.layout.addWidget(self.notes, 18, 0, 1, 2)
        self.layout.addWidget(self.image, 2, 1, 7, 1)
        self.layout.addWidget(QLabel("Birhday"), 9, 1)
        self.layout.addWidget(self.birthday, 10, 1)
        self.layout.addWidget(QLabel("First Contact"), 11, 1)
        self.layout.addWidget(self.firstcontact, 12, 1)
        self.layout.addWidget(QLabel("Fiscal"), 13, 1)
        self.layout.addWidget(self.fiscal, 14, 1, 1, 1)
        self.setLayout(self.layout)

        self.reload()
        self.number.textEdited.connect(self.clientChanged)
        self.name.textEdited.connect(self.clientChanged)
        self.address.textEdited.connect(self.clientChanged)
        self.email.textEdited.connect(self.clientChanged)
        self.mobile.textEdited.connect(self.clientChanged)
        self.profession.textEdited.connect(self.clientChanged)
        self.reason.textEdited.connect(self.clientChanged)
        self.how.textEdited.connect(self.clientChanged)
        self.notes.textChanged.connect(self.clientChanged)
        self.fiscal.textEdited.connect(self.clientChanged)
        self.birthday.dateChanged.connect(self.clientChanged)
        self.firstcontact.dateChanged.connect(self.clientChanged)

    def reload(self):
        self.loading = True
        if self.win.client:
            self.number.setText(self.win.client["number"])
            self.name.setText(self.win.client["name"])
            self.address.setText(self.win.client["address"])
            self.email.setText(self.win.client["email"])
            self.mobile.setText(self.win.client["mobile"])
            self.profession.setText(self.win.client["profession"])
            self.reason.setText(self.win.client["reason"])
            self.how.setText(self.win.client["how"])
            self.notes.setText(self.win.client["notes"])

            self.birthday.setDate(
                QDate(self.win.client["birthday_year"],
                      self.win.client["birthday_month"],
                      self.win.client["birthday_day"]))
            self.firstcontact.setDate(
                QDate(self.win.client["first_contact_year"],
                      self.win.client["first_contact_month"],
                      self.win.client["first_contact_day"]))
            self.fiscal.setText(self.win.client["fiscal"])
        else:
            self.number.setText("")
            self.name.setText("")
            self.address.setText("")
            self.email.setText("")
            self.mobile.setText("")
            self.profession.setText("")
            self.reason.setText("")
            self.how.setText("")
            self.notes.setText("")
            self.fiscal.setText("")
            self.birthday.setDate(QDate(1900, 1, 1))
            self.firstcontact.setDate(QDate(1900, 1, 1))
        self.loading = False

    def clientChanged(self):
        if self.loading:
            return
        self.win.client["number"] = self.number.text()
        self.win.client["name"] = self.name.text()
        self.win.client["address"] = self.address.text()
        self.win.client["email"] = self.email.text()
        self.win.client["mobile"] = self.mobile.text()
        self.win.client["profession"] = self.profession.text()
        self.win.client["reason"] = self.reason.text()
        self.win.client["how"] = self.how.text()
        self.win.client["notes"] = self.notes.toPlainText()
        self.win.client["fiscal"] = self.fiscal.text()
        self.win.client["birthday_year"] = self.birthday.date().year()
        self.win.client["birthday_month"] = self.birthday.date().month()
        self.win.client["birthday_day"] = self.birthday.date().day()
        self.win.client["first_contact_year"] = self.firstcontact.date().year()
        self.win.client["first_contact_month"] = self.firstcontact.date(
        ).month()
        self.win.client["first_contact_day"] = self.firstcontact.date().day()
        self.win.clients.update(self.win.client,
                                doc_ids=[self.win.client.doc_id])
        self.win.updateClient()
示例#12
0
class ClientEditor(QWidget):
    def __init__(self, win):
        QWidget.__init__(self)
        self.win = win
        self.id = 0
        title = QLabel("Client Data")
        fnt = title.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        title.setFont(fnt)
        self.layout = QGridLayout()
        self.layout.setColumnStretch(0, 1)
        self.number = QLineEdit()
        self.name = QLineEdit()
        self.email = QLineEdit()
        self.profession = QLineEdit()
        self.address = QLineEdit()
        self.mobile = QLineEdit()
        self.notes = QTextEdit()
        self.birthday = QDateEdit()
        self.birthday.setCalendarPopup(True)
        self.birthday.setDisplayFormat("dd.MM.yyyy")

        self.image = ImageSelector()
        self.image.setMinimumWidth(250)

        self.layout.addWidget(title, 0, 0, 1, 2)
        self.layout.addWidget(QLabel("Id"), 1, 0)
        self.layout.addWidget(self.number, 2, 0)

        self.layout.addWidget(QLabel("Name"), 3, 0)
        self.layout.addWidget(self.name, 4, 0)
        self.layout.addWidget(QLabel("Address"), 5, 0)
        self.layout.addWidget(self.address, 6, 0)
        self.layout.addWidget(QLabel("Email"), 7, 0)
        self.layout.addWidget(self.email, 8, 0)
        self.layout.addWidget(QLabel("Mobile"), 9, 0)
        self.layout.addWidget(self.mobile, 10, 0)
        self.layout.addWidget(QLabel("Profession"), 11, 0)
        self.layout.addWidget(self.profession, 12, 0)
        self.layout.addWidget(QLabel("Notes"), 17, 0)
        self.layout.addWidget(self.notes, 18, 0, 1, 2)
        self.layout.addWidget(self.image, 2, 1, 7, 1)
        self.layout.addWidget(QLabel("Birhday"), 9, 1)
        self.layout.addWidget(self.birthday, 10, 1)
        self.setLayout(self.layout)

        self.reload()
        self.number.textEdited.connect(self.clientChanged)
        self.name.textEdited.connect(self.clientChanged)
        self.address.textEdited.connect(self.clientChanged)
        self.email.textEdited.connect(self.clientChanged)
        self.mobile.textEdited.connect(self.clientChanged)
        self.profession.textEdited.connect(self.clientChanged)
        self.notes.textChanged.connect(self.clientChanged)
        self.birthday.dateChanged.connect(self.clientChanged)
        self.image.clicked.connect(self.seek)

    def reload(self):
        self.loading = True
        if self.win.client:
            self.number.setText(self.win.client["number"])
            self.name.setText(self.win.client["name"])
            self.address.setText(self.win.client["address"])
            self.email.setText(self.win.client["email"])
            self.mobile.setText(self.win.client["mobile"])
            self.profession.setText(self.win.client["profession"])
            self.notes.setText(self.win.client["notes"])
            self.birthday.setDate(
                QDate(self.win.client["birthday_year"],
                      self.win.client["birthday_month"],
                      self.win.client["birthday_day"]))
            name = os.path.join(str(self.win.client.doc_id) + ".png")
            path = os.path.join(self.win.database, "images", name)
            if os.path.exists(path):
                self.image.setImage(QImage(path))
            else:
                self.image.setImage(QImage(":/images/image_placeholder.png"))
        else:
            self.number.setText("")
            self.name.setText("")
            self.address.setText("")
            self.email.setText("")
            self.mobile.setText("")
            self.profession.setText("")
            self.notes.setText("")
            self.birthday.setDate(QDate(1900, 1, 1))
            self.image.setImage(QImage(":/images/image_placeholder.png"))
        self.loading = False

    def clientChanged(self):
        if self.loading:
            return
        self.win.client["number"] = self.number.text()
        self.win.client["name"] = self.name.text()
        self.win.client["address"] = self.address.text()
        self.win.client["email"] = self.email.text()
        self.win.client["mobile"] = self.mobile.text()
        self.win.client["profession"] = self.profession.text()
        self.win.client["notes"] = self.notes.toPlainText()
        self.win.client["birthday_year"] = self.birthday.date().year()
        self.win.client["birthday_month"] = self.birthday.date().month()
        self.win.client["birthday_day"] = self.birthday.date().day()
        self.win.clients.update(self.win.client,
                                doc_ids=[self.win.client.doc_id])
        self.win.updateClient()

    def seek(self):
        fileName = ""
        dialog = QFileDialog()
        dialog.setFileMode(QFileDialog.AnyFile)
        dialog.setNameFilter("Images (*.png *.gif *.jpg);;All (*)")
        dialog.setWindowTitle("Load Image")
        dialog.setOption(QFileDialog.DontUseNativeDialog, True)
        dialog.setAcceptMode(QFileDialog.AcceptOpen)
        if dialog.exec():
            fileName = dialog.selectedFiles()[0]
        del dialog
        if not fileName:
            return

        # copy file to database dir
        name = os.path.join(str(self.win.client.doc_id) + ".png")
        path = os.path.join(self.win.database, "images", name)
        shutil.copy(fileName, path)
        self.image.setImage(QImage(path))
        self.clientChanged()