class TableCellButtons(QWidget):
    deleteItem = pyqtSignal(object)
    editItem = pyqtSignal(object)

    def __init__(self):
        QWidget.__init__(self)
        self.delete = FlatButton(":/images/trash_normal.png",
                                 ":/images/trash_hover.png")
        self.edit = FlatButton(":/images/edit_normal.png",
                               ":/images/edit_hover.png")
        self.edit.setToolTip(
            QCoreApplication.translate("TableCellButtons", "Edit Item"))
        self.delete.setToolTip(
            QCoreApplication.translate("TableCellButtons", "Delete Item"))
        self.item = None

        hbox = QHBoxLayout()
        hbox.addWidget(self.edit)
        hbox.addWidget(self.delete)
        self.setLayout(hbox)

        self.delete.clicked.connect(self.deleteItemClicked)
        self.edit.clicked.connect(self.editItemClicked)

    def setItem(self, item):
        self.item = item

    def deleteItemClicked(self):
        self.deleteItem.emit(self.item)

    def editItemClicked(self):
        self.editItem.emit(self.item)
    def __init__(self):
        QWidget.__init__(self)
        self.filename = ""
        self.undoStack = QUndoStack()
        self.undo = FlatButton(":/images/undo_normal.png",
                               ":/images/undo_hover.png", "",
                               ":/images/undo_disabled.png")
        self.redo = FlatButton(":/images/redo_normal.png",
                               ":/images/redo_hover.png", "",
                               ":/images/redo_disabled.png")
        self.undo.setToolTip("Undo")
        self.redo.setToolTip("Redo")
        self.undo.setEnabled(False)
        self.redo.setEnabled(False)
        hbox = QHBoxLayout()
        hbox.addStretch(0)
        hbox.addWidget(self.undo)
        hbox.addWidget(self.redo)

        self.titleLabel = QLabel()
        fnt = self.titleLabel.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        self.titleLabel.setFont(fnt)
        self.layout = QGridLayout()
        self.layout.addWidget(self.titleLabel, 0, 0)
        self.layout.addLayout(hbox, 0, 2)
        self.setLayout(self.layout)
Ejemplo n.º 3
0
    def __init__(self):
        QWidget.__init__(self)
        self.changed = False
        self.grid = QGridLayout()
        self.cssclass = QLineEdit()
        self.setAutoFillBackground(True)

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

        titleLabel = QLabel("Row Module Settings")
        fnt = titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        titleLabel.setFont(fnt)

        vbox = QVBoxLayout()
        vbox.addStretch()
        self.grid.addWidget(titleLabel, 0, 0)
        self.grid.addWidget(close, 0, 1, 1, 1, Qt.AlignRight)
        self.grid.addWidget(QLabel("CSS Class"), 1, 0)
        self.grid.addWidget(self.cssclass, 2, 0, 1, 2)
        self.grid.addLayout(vbox, 3, 0)
        self.setLayout(self.grid)

        close.clicked.connect(self.closeEditor)
        self.cssclass.textChanged.connect(self.contentChanged)
Ejemplo n.º 4
0
    def __init__(self, theme):
        QWidget.__init__(self)
        self.theme = theme
        self.themename = theme.name
        self.setMaximumWidth(400)
        picurl = ":/images/theme.png"
        self.url = theme.sample_url
        if theme.sample_pic:
            picurl = theme.sample_pic
        pic = FlatButton(picurl, picurl)
        map = QPixmap(400, 200)
        p = QPainter(map)
        p.setRenderHint(QPainter.Antialiasing)
        p.setRenderHint(QPainter.TextAntialiasing)
        p.drawImage(QRect(0, 0, 400, 200), QImage(picurl))
        p.fillRect(0, 0,
                   map.size().width(),
                   map.size().height(), QColor(69, 187, 230, 125))
        if self.url:
            w = 100
            h = 30

            p.fillRect(QRect((400 - w) / 2, (200 - h) / 2, w, h),
                       QColor(69, 187, 230, 255))
            p.drawRoundedRect(QRect((400 - w) / 2, (200 - h) / 2, w, h), 5, 5)
            font = QFont()
            font.setFamily("Arial")
            font.setBold(True)
            font.setPixelSize(20)
            p.setFont(font)
            p.setPen(QPen(Qt.black))
            p.drawText(QRectF(0, 0, 400, 200), "PREVIEW",
                       QTextOption(Qt.AlignHCenter | Qt.AlignVCenter))

            pic.clicked.connect(self.clicked)
        else:
            pic.setCursor(Qt.ArrowCursor)
        del p

        pic.setHoverPixmap(map)
        pic.setMaximumSize(400, 200)
        pic.setScaledContents(True)
        if theme.aktiv:
            name = QLabel(theme.name.upper() + " (Aktiv)")
        else:
            name = QLabel(theme.name.upper())
        fnt = name.font()
        fnt.setPointSize(13)
        fnt.setBold(True)
        name.setFont(fnt)
        layout = QGridLayout()
        layout.addWidget(pic, 0, 0, 1, 2)
        layout.addWidget(name, 1, 0)
        if not theme.aktiv:
            activate = QPushButton("Activate")
            layout.addWidget(activate, 1, 1, 1, 1, Qt.AlignRight)
            activate.clicked.connect(self.activate)

        self.setLayout(layout)
    def __init__(self):
        ElementEditorInterface.__init__(self)
        self.class_name = "RevolutionSliderEditor"
        self.display_name = "RevolutionSlider"
        self.tag_name = "RevolutionSlider"
        self.version = "1.0"
        self.icon = QImage(":/revolution.png")
        self.changed = False
        self.setAutoFillBackground(True)

        grid = QGridLayout()
        self.id = QLineEdit()
        self.id.setMaximumWidth(200)
        self.adminlabel = QLineEdit()
        self.adminlabel.setMaximumWidth(200)
        titleLabel = QLabel("Slider Module")
        fnt = titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        titleLabel.setFont(fnt)

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

        addSlide = QPushButton("Add Slide")
        addSlide.setMaximumWidth(120)

        self.list = QTableWidget(0, 2, self)
        self.list.verticalHeader().hide()
        self.list.setSelectionMode(QAbstractItemView.SingleSelection)
        self.list.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.list.horizontalHeader().setSectionResizeMode(
            1, QHeaderView.Stretch)
        self.list.setToolTip("Double click to edit item")
        labels = ["", "Name"]
        self.list.setHorizontalHeaderLabels(labels)

        grid.addWidget(titleLabel, 0, 0)
        grid.addWidget(close, 0, 2, 1, 1, Qt.AlignRight)
        grid.addWidget(addSlide, 1, 0)
        grid.addWidget(self.list, 2, 0, 1, 3)
        grid.addWidget(QLabel("Id"), 4, 0)
        grid.addWidget(self.id, 5, 0)
        grid.addWidget(QLabel("Admin Label"), 6, 0)
        grid.addWidget(self.adminlabel, 7, 0)

        self.setLayout(grid)

        addSlide.clicked.connect(self.addSlide)
        self.adminlabel.textChanged.connect(self.contentChanged)
        self.id.textChanged.connect(self.contentChanged)
        close.clicked.connect(self.closeEditor)
        self.list.cellDoubleClicked.connect(self.tableDoubleClicked)

        self.installEventFilter(self)
    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)
Ejemplo n.º 7
0
    def __init__(self):
        ElementEditorInterface.__init__(self)
        self.site = None
        self.class_name = "TextEditor"
        self.display_name = "Text"
        self.tag_name = "Text"
        self.version = "1.0"
        self.icon = QImage(":/texteditor.png")
        self.changed = False
        self.setAutoFillBackground(True)
        font = QFont()
        font.setFamily("Courier")
        font.setFixedPitch(True)
        font.setPointSize(15)

        grid = QGridLayout()

        close = FlatButton(":/images/close_normal.png",
                           ":/images/close_hover.png")
        close.setToolTip(QCoreApplication.translate("general", "Close Editor"))
        self.html = QTextEdit()
        self.html.setFont(font)
        self.html.setAcceptRichText(False)
        self.html.setLineWrapMode(QTextEdit.NoWrap)
        metrics = QFontMetrics(font)
        self.html.setTabStopWidth(4 * metrics.width(' '))

        self.highlighter = XmlHighlighter(self.html.document())

        self.adminlabel = QLineEdit()
        self.adminlabel.setMaximumWidth(200)

        self.titleLabel = QLabel(
            QCoreApplication.translate("TextEditor", "Text Module"))
        fnt = self.titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        self.titleLabel.setFont(fnt)

        grid.addWidget(self.titleLabel, 0, 0)
        grid.addWidget(close, 0, 1, 1, 1, Qt.AlignRight)
        grid.addWidget(self.html, 1, 0, 1, 2)
        grid.addWidget(
            QLabel(QCoreApplication.translate("TextEditor", "Admin Label")), 2,
            0)
        grid.addWidget(self.adminlabel, 3, 0, 1, 2)
        self.setLayout(grid)

        close.clicked.connect(self.closeEditor)
        self.html.textChanged.connect(self.contentChanged)
        self.adminlabel.textChanged.connect(self.contentChanged)
Ejemplo n.º 8
0
class Dashboard(QWidget):
    createSite = pyqtSignal()

    def __init__(self):
        QWidget.__init__(self)

        vbox = QVBoxLayout()
        layout = QGridLayout()
        title = QLabel()
        title.setText("Dashboard")
        fnt = title.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        title.setFont(fnt)

        self.browser = QTextBrowser()
        self.browser.setOpenLinks(False)

        self.create_button = FlatButton(":/images/create_normal.png",
                                        ":/images/create_hover.png",
                                        ":/images/create_pressed.png")
        self.create_button.setToolTip("Add a client")

        self.info = QLabel()
        self.info.setText("Welcome to Maria...")

        space = QWidget()
        space2 = QWidget()
        space3 = QWidget()
        space.setMinimumHeight(30)
        space2.setMinimumHeight(30)
        space3.setMinimumHeight(30)
        layout.addWidget(title, 0, 0, 1, 3)
        layout.addWidget(self.info, 1, 0, 1, 3)
        layout.addWidget(space, 2, 0)
        layout.addWidget(self.create_button, 3, 0, 1, 1, Qt.AlignCenter)

        vbox.addLayout(layout)
        vbox.addSpacing(40)
        vbox.addWidget(self.browser)
        self.setLayout(vbox)

        self.create_button.clicked.connect(self.createClicked)

    @pyqtSlot()
    def createClicked(self):
        self.createSite.emit()
    def __init__(self):
        QWidget.__init__(self)
        self.delete = FlatButton(":/images/trash_normal.png",
                                 ":/images/trash_hover.png")
        self.edit = FlatButton(":/images/edit_normal.png",
                               ":/images/edit_hover.png")
        self.edit.setToolTip(
            QCoreApplication.translate("TableCellButtons", "Edit Item"))
        self.delete.setToolTip(
            QCoreApplication.translate("TableCellButtons", "Delete Item"))
        self.item = None

        hbox = QHBoxLayout()
        hbox.addWidget(self.edit)
        hbox.addWidget(self.delete)
        self.setLayout(hbox)

        self.delete.clicked.connect(self.deleteItemClicked)
        self.edit.clicked.connect(self.editItemClicked)
Ejemplo n.º 10
0
    def __init__(self):
        AnimateableEditor.__init__(self)
        self.grid = QGridLayout()
        self.cssclass = QLineEdit()
        self.style = QLineEdit()
        self.attributes = QLineEdit()
        self.id = QLineEdit()
        self.changed = False
        self.setAutoFillBackground(True)

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

        titleLabel = QLabel("Section Module Settings")
        fnt = titleLabel.font()
        fnt.setPointSize(16)
        fnt.setBold(True)
        titleLabel.setFont(fnt)

        vbox = QVBoxLayout()
        vbox.addStretch()

        self.grid.addWidget(titleLabel, 0, 0)
        self.grid.addWidget(close, 0, 1, 1, 1, Qt.AlignRight)
        self.grid.addWidget(QLabel("CSS Class"), 1, 0)
        self.grid.addWidget(self.cssclass, 2, 0, 1, 2)
        self.grid.addWidget(QLabel("Style"), 3, 0)
        self.grid.addWidget(self.style, 4, 0, 1, 2)
        self.grid.addWidget(QLabel("Aditional Attributes"), 5, 0)
        self.grid.addWidget(self.attributes, 6, 0, 1, 2)
        self.grid.addWidget(QLabel("Id"), 7, 0)
        self.grid.addWidget(self.id, 8, 0, 1, 2)
        self.grid.addLayout(vbox, 10, 0)
        self.setLayout(self.grid)

        close.clicked.connect(self.closeEditor)
        self.cssclass.textChanged.connect(self.contentChanged)
        self.style.textChanged.connect(self.contentChanged)
        self.attributes.textChanged.connect(self.contentChanged)
        self.id.textChanged.connect(self.contentChanged)
Ejemplo n.º 11
0
    def __init__(self):
        QWidget.__init__(self)

        from widgets.content import ContentType
        from widgets.flatbutton import FlatButton
        from widgets.hyperlink import HyperLink
        from widgets.section import Section

        self.editButton = FlatButton(":/images/edit_normal.png",
                                     ":/images/edit_hover.png")
        self.copyButton = FlatButton(":/images/copy_normal.png",
                                     ":/images/copy_hover.png")
        self.deleteButton = FlatButton(":/images/trash_normal.png",
                                       ":/images/trash_hover.png")
        self.addColumns = HyperLink(
            QCoreApplication.translate("RowEditor", "(+) Add Columns"))
        self.editButton.setToolTip(
            QCoreApplication.translate("RowEditor", "Edit Row"))
        self.deleteButton.setToolTip(
            QCoreApplication.translate("RowEditor", "Delete Row"))
        self.copyButton.setToolTip(
            QCoreApplication.translate("RowEditor", "Copy Row"))
        self.editButton.setMaximumWidth(24)
        self.copyButton.setMaximumWidth(24)
        self.deleteButton.setMaximumWidth(24)
        vbox = QVBoxLayout()
        vbox.setAlignment(Qt.AlignTop)
        vbox.setSpacing(5)
        vbox.addWidget(self.editButton)
        vbox.addWidget(self.copyButton)
        vbox.addWidget(self.deleteButton, 0, Qt.AlignBottom)
        layout = QHBoxLayout()

        pal = self.palette()
        pal.setColor(QPalette.Background,
                     QColor(self.palette().alternateBase().color()))
        self.setPalette(pal)
        self.setAutoFillBackground(True)

        self.highlightedRect = QRect()
        self.layout = QGridLayout()
        self.layout.addWidget(self.addColumns, 0, 0, 1, 1, Qt.AlignCenter)
        self.layout.setColumnStretch(0, 1)

        layout.addItem(vbox)
        layout.addLayout(self.layout)
        self.setLayout(layout)

        self.deleteButton.clicked.connect(self.delete)
        self.copyButton.clicked.connect(self.copy)
        self.editButton.clicked.connect(self.edit)
        self.addColumns.clicked.connect(self.insertColumns)
class UndoableEditor(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.filename = ""
        self.undoStack = QUndoStack()
        self.undo = FlatButton(":/images/undo_normal.png",
                               ":/images/undo_hover.png", "",
                               ":/images/undo_disabled.png")
        self.redo = FlatButton(":/images/redo_normal.png",
                               ":/images/redo_hover.png", "",
                               ":/images/redo_disabled.png")
        self.undo.setToolTip("Undo")
        self.redo.setToolTip("Redo")
        self.undo.setEnabled(False)
        self.redo.setEnabled(False)
        hbox = QHBoxLayout()
        hbox.addStretch(0)
        hbox.addWidget(self.undo)
        hbox.addWidget(self.redo)

        self.titleLabel = QLabel()
        fnt = self.titleLabel.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        self.titleLabel.setFont(fnt)
        self.layout = QGridLayout()
        self.layout.addWidget(self.titleLabel, 0, 0)
        self.layout.addLayout(hbox, 0, 2)
        self.setLayout(self.layout)

        #connect(self.redo, SIGNAL(clicked()), self, SLOT(redo()))
        #connect(self.undo, SIGNAL(clicked()), self, SLOT(undo()))
        #connect(self.undoStack, SIGNAL(canUndoChanged(bool)), self, SLOT(canUndoChanged(bool)))
        #connect(self.undoStack, SIGNAL(canRedoChanged(bool)), self, SLOT(canRedoChanged(bool)))
        #connect(self.undoStack, SIGNAL(undoTextChanged(QString)), self, SLOT(undoTextChanged(QString)))
        #connect(self.undoStack, SIGNAL(redoTextChanged(QString)), self, SLOT(redoTextChanged(QString)))

    def contentChanged(self, text):
        changeCommand = ChangeFileCommand(self, self.filename, text)
        self.undoStack.push(changeCommand)
Ejemplo n.º 13
0
    def __init__(self):
        QWidget.__init__(self)
        self.content = None
        self.type = ""
        self.setAutoFillBackground(True)
        self.setMinimumWidth(120)
        self.setMinimumHeight(50)
        self.setMaximumHeight(50)
        self.zoom = False

        self.mode = Mode.EMPTY
        self.normalColor = QColor(
            self.palette().base().color().name()).lighter().name()
        self.enabledColor = self.palette().base().color().name()
        self.dropColor = QColor(
            self.palette().base().color().name()).lighter().lighter().name()
        self.setColor(self.normalColor)
        self.link = HyperLink(
            QCoreApplication.translate("ElementEditor", "(+) Insert Module"))

        self.editButton = FlatButton(":/images/edit_normal.png",
                                     ":/images/edit_hover.png")
        self.copyButton = FlatButton(":/images/copy_normal.png",
                                     ":/images/copy_hover.png")
        self.deleteButton = FlatButton(":/images/trash_normal.png",
                                       ":/images/trash_hover.png")
        self.editButton.setVisible(False)
        self.copyButton.setVisible(False)
        self.deleteButton.setVisible(False)
        self.editButton.setToolTip(
            QCoreApplication.translate("ElementEditor", "Edit Element"))
        self.deleteButton.setToolTip(
            QCoreApplication.translate("ElementEditor", "Delete Element"))
        self.copyButton.setToolTip(
            QCoreApplication.translate("ElementEditor", "Copy Element"))
        self.text = QLabel(QCoreApplication.translate("ElementEditor", "Text"))
        self.text.setVisible(False)
        layout = QHBoxLayout()
        layout.addWidget(self.link, 0, Qt.AlignCenter)
        layout.addWidget(self.editButton)
        layout.addWidget(self.copyButton)
        layout.addWidget(self.text, 1, Qt.AlignCenter)
        layout.addWidget(self.deleteButton)
        self.setLayout(layout)

        self.editButton.clicked.connect(self.edit)
        self.deleteButton.clicked.connect(self.delete)
        self.copyButton.clicked.connect(self.copy)
        self.link.clicked.connect(self.enable)
Ejemplo n.º 14
0
    def createButton(self, icon, text):
        btn = FlatButton()
        pmNormal = QPixmap.fromImage(QImage(":/images/module_normal.png"))
        pmHover = QPixmap.fromImage(QImage(":/images/module_hover.png"))
        title = QLabel()
        pal = self.palette()
        pal.setColor(QPalette.Background, QColor("#999999"))
        pal.setColor(QPalette.Foreground, QColor("#000000"))
        title.setPalette(pal)
        title.setText(text)
        title.setFixedWidth(90)
        title.render(pmNormal, QPoint(80, 40))
        title.render(pmHover, QPoint(80, 40))

        iconLabel = QLabel()
        iconLabel.setPixmap(QPixmap.fromImage(icon))
        iconLabel.render(pmNormal, QPoint(33, 33))
        iconLabel.render(pmHover, QPoint(33, 33))

        btn.setNormalPixmap(pmNormal)
        btn.setHoverPixmap(pmHover)
        return btn
Ejemplo n.º 15
0
class ElementEditor(QWidget):
    elementCopied = pyqtSignal(object)
    elementEnabled = pyqtSignal()
    elementDragged = pyqtSignal()

    def __init__(self):
        QWidget.__init__(self)
        self.content = None
        self.type = ""
        self.setAutoFillBackground(True)
        self.setMinimumWidth(120)
        self.setMinimumHeight(50)
        self.setMaximumHeight(50)
        self.zoom = False

        self.mode = Mode.EMPTY
        self.normalColor = QColor(
            self.palette().base().color().name()).lighter().name()
        self.enabledColor = self.palette().base().color().name()
        self.dropColor = QColor(
            self.palette().base().color().name()).lighter().lighter().name()
        self.setColor(self.normalColor)
        self.link = HyperLink(
            QCoreApplication.translate("ElementEditor", "(+) Insert Module"))

        self.editButton = FlatButton(":/images/edit_normal.png",
                                     ":/images/edit_hover.png")
        self.copyButton = FlatButton(":/images/copy_normal.png",
                                     ":/images/copy_hover.png")
        self.deleteButton = FlatButton(":/images/trash_normal.png",
                                       ":/images/trash_hover.png")
        self.editButton.setVisible(False)
        self.copyButton.setVisible(False)
        self.deleteButton.setVisible(False)
        self.editButton.setToolTip(
            QCoreApplication.translate("ElementEditor", "Edit Element"))
        self.deleteButton.setToolTip(
            QCoreApplication.translate("ElementEditor", "Delete Element"))
        self.copyButton.setToolTip(
            QCoreApplication.translate("ElementEditor", "Copy Element"))
        self.text = QLabel(QCoreApplication.translate("ElementEditor", "Text"))
        self.text.setVisible(False)
        layout = QHBoxLayout()
        layout.addWidget(self.link, 0, Qt.AlignCenter)
        layout.addWidget(self.editButton)
        layout.addWidget(self.copyButton)
        layout.addWidget(self.text, 1, Qt.AlignCenter)
        layout.addWidget(self.deleteButton)
        self.setLayout(layout)

        self.editButton.clicked.connect(self.edit)
        self.deleteButton.clicked.connect(self.delete)
        self.copyButton.clicked.connect(self.copy)
        self.link.clicked.connect(self.enable)

    def enable(self):
        from widgets.columneditor import ColumnEditor
        from widgets.sectioneditor import SectionEditor
        dlg = ModulDialog()
        dlg.exec()

        if not dlg.result:
            return
        editor = Plugins.element_plugins[dlg.result]
        self.content = editor.getDefaultContent()
        if isinstance(self.parentWidget(), ColumnEditor):
            self.parentWidget().column._items.append(self.content)
        elif isinstance(self.parentWidget(), SectionEditor):
            self.parentWidget().section._items.append(self.content)
        self.type = editor.tag_name
        self.text.setText(editor.display_name)

        self.setMode(Mode.ENABLED)
        self.elementEnabled.emit()
        self.edit()

    def copy(self):
        self.elementCopied.emit(self)

    def delete(self):
        self.parentWidget().removeElement(self.content)
        self.parentWidget().layout.removeWidget(self)
        self.hide()
        ce = self.getContentEditor()
        if ce:
            ce.editChanged("Delete Element")

    def edit(self):
        ce = self.getContentEditor()
        if ce:
            ce.elementEdit(self)

    def setColor(self, name):
        pal = self.palette()
        pal.setColor(QPalette.Background, QColor(name))
        self.setPalette(pal)

    def setMode(self, mode):
        self.mode = mode
        if mode == Mode.EMPTY:
            self.link.setVisible(True)
            self.editButton.setVisible(False)
            self.copyButton.setVisible(False)
            self.deleteButton.setVisible(False)
            self.text.setVisible(False)
            self.setColor(self.normalColor)
        elif mode == Mode.ENABLED:
            self.link.setVisible(False)
            self.editButton.setVisible(True)
            self.copyButton.setVisible(True)
            self.deleteButton.setVisible(True)
            self.text.setVisible(True)
            self.setColor(self.enabledColor)
        elif mode == Mode.DROPZONE:
            self.link.setVisible(False)
            self.editButton.setVisible(False)
            self.copyButton.setVisible(False)
            self.deleteButton.setVisible(False)
            self.text.setVisible(True)
            self.text.setText(
                QCoreApplication.translate("ElementEditor", "Drop Here"))
            self.setColor(self.dropColor)

    def getContentEditor(self):
        se = self.getSectionEditor()
        if se:
            pe = se.parentWidget()
            if pe:
                sa = pe.parentWidget()
                if sa:
                    vp = sa.parentWidget()
                    if vp:
                        cee = vp.parentWidget()
                        if cee:
                            return cee
        return None

    def getSectionEditor(self):
        from widgets.sectioneditor import SectionEditor
        from widgets.columneditor import ColumnEditor
        se = self.parentWidget()
        if isinstance(se, SectionEditor):
            return se
        elif isinstance(se, ColumnEditor):
            re = se.parentWidget()
            if re:
                se = re.parentWidget()
                if se:
                    return se
        return None

    def getContent(self):
        return self.content

    def setContent(self, content):
        self.content = content
        self.type = content.tag_name
        if content.adminlabel:
            self.text.setText(content.adminlabel)
        else:
            if content.display_name:
                self.text.setText(content.display_name)
            else:
                self.text.setText(content.tag_name)

    def mousePressEvent(self, event):
        from widgets.columneditor import ColumnEditor
        from widgets.sectioneditor import SectionEditor
        if self.mode != Mode.ENABLED or event.button() != Qt.LeftButton:
            return

        if self.parentWidget().layout.count() == 1:
            self.elementDragged.emit()

        mimeData = WidgetMimeData()
        mimeData.setData(self)
        parent = self.parentWidget()
        if isinstance(parent, ColumnEditor):
            mimeData.source_list = parent.column._items
        elif isinstance(parent, SectionEditor):
            mimeData.source_list = parent.section._items

        pixmap = QPixmap(self.size())
        self.render(pixmap)

        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.setHotSpot(event.pos())
        drag.setPixmap(pixmap)
        self.hide()

        if drag.exec(Qt.MoveAction) == Qt.IgnoreAction:
            self.show()

    def dropped(self):
        #seems to be a bug that after dropping the item the bgcolor changes
        self.setColor(self.enabledColor)
Ejemplo n.º 16
0
class RowEditor(QWidget):
    rowEditorCopied = pyqtSignal(object)

    def __init__(self):
        QWidget.__init__(self)

        from widgets.content import ContentType
        from widgets.flatbutton import FlatButton
        from widgets.hyperlink import HyperLink
        from widgets.section import Section

        self.editButton = FlatButton(":/images/edit_normal.png",
                                     ":/images/edit_hover.png")
        self.copyButton = FlatButton(":/images/copy_normal.png",
                                     ":/images/copy_hover.png")
        self.deleteButton = FlatButton(":/images/trash_normal.png",
                                       ":/images/trash_hover.png")
        self.addColumns = HyperLink("(+) Add Columns")
        self.editButton.setToolTip("Edit Row")
        self.deleteButton.setToolTip("Delete Row")
        self.copyButton.setToolTip("Copy Row")
        self.editButton.setMaximumWidth(24)
        self.copyButton.setMaximumWidth(24)
        self.deleteButton.setMaximumWidth(24)
        vbox = QVBoxLayout()
        vbox.setAlignment(Qt.AlignTop)
        vbox.setSpacing(5)
        vbox.addWidget(self.editButton)
        vbox.addWidget(self.copyButton)
        vbox.addWidget(self.deleteButton, 0, Qt.AlignBottom)
        layout = QHBoxLayout()

        pal = self.palette()
        pal.setColor(QPalette.Background,
                     QColor(self.palette().alternateBase().color()))
        self.setPalette(pal)
        self.setAutoFillBackground(True)

        self.highlightedRect = QRect()
        self.layout = QGridLayout()
        self.layout.addWidget(self.addColumns, 0, 0, 1, 1, Qt.AlignCenter)
        self.layout.setColumnStretch(0, 1)

        layout.addItem(vbox)
        layout.addLayout(self.layout)
        self.setLayout(layout)

        self.deleteButton.clicked.connect(self.delete)
        self.copyButton.clicked.connect(self.copy)
        self.editButton.clicked.connect(self.edit)
        self.addColumns.clicked.connect(self.insertColumns)

    def edit(self):
        ce = self.getContentEditor()
        if ce:
            ce.rowEdit(self)

    def copy(self):
        self.rowEditorCopied.emit(self)

    def delete(self):
        se = self.parentWidget()
        if se:
            se.removeRowEditor(self)
            se.section._items.remove(self.row)
        ce = self.getContentEditor()
        if ce:
            ce.editChanged("Delete Row")

    def addColumn(self, ce, column):
        if self.addColumns.isVisible():
            self.addColumns.setVisible(False)
            self.layout.removeWidget(self.addColumns)

        self.layout.addWidget(ce, 0, column)
        self.layout.setColumnStretch(column, ce.column.span)

    def load(self, row):
        from widgets.columneditor import ColumnEditor

        self.row = row
        i = 0
        for column in self.row.columns:
            ce = ColumnEditor()
            ce.load(column)
            self.addColumn(ce, i)
            i = i + 1

    def getContentEditor(self):
        se = self.parentWidget()
        if se:
            pe = se.parentWidget()
            if pe:
                sa = pe.parentWidget()
                if sa:
                    vp = sa.parentWidget()
                    if vp:
                        cee = vp.parentWidget()
                        if cee:
                            return cee
        return None

    def insertColumns(self):
        dlg = ColumnsDialog()
        dlg.exec()
        if dlg.result == 0:
            return

        if dlg.result == 1:  # 1/1
            col = Column()
            col.span = 12
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 0)

        elif dlg.result == 2:  # 1/2 - 1/2
            for i in range(2):
                col = Column()
                col.span = 6
                self.row._columns.append(col)
                ce = ColumnEditor()
                ce.load(col)
                self.addColumn(ce, i)

        elif dlg.result == 3:  # 1/3 - 1/3 - 1/3
            for i in range(3):
                col = Column()
                col.span = 4
                self.row._columns.append(col)
                ce = ColumnEditor()
                ce.load(col)
                self.addColumn(ce, i)

        elif dlg.result == 4:  # 1/4 - 1/4 - 1/4 - 1/4
            for i in range(4):
                col = Column()
                col.span = 3
                self.row._columns.append(col)
                ce = ColumnEditor()
                ce.load(col)
                self.addColumn(ce, i)

        elif dlg.result == 5:  # 2/3 - 1/3
            col = Column()
            col.span = 8
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 0)
            col = Column()
            col.span = 4
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 1)

        elif dlg.result == 6:  # 1/3 - 2/3
            col = Column()
            col.span = 4
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 0)
            col = Column()
            col.span = 8
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 1)

        elif dlg.result == 7:  # 1/4 - 3/4
            col = Column()
            col.span = 2
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 0)
            col = Column()
            col.span = 9
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 1)

        elif dlg.result == 8:  # 3/4 - 1/4
            col = Column()
            col.span = 9
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 0)
            col = Column()
            col.span = 3
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 1)

        elif dlg.result == 9:  # 1/2 - 1/4 - 1/4
            col = Column()
            col.span = 6
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 0)
            col = Column()
            col.span = 3
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 1)
            col = Column()
            col.span = 3
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 2)

        elif dlg.result == 10:  # 1/4 - 1/4 - 1/2
            col = Column()
            col.span = 3
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 0)
            col = Column()
            col.span = 3
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 1)
            col = Column()
            col.span = 6
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 2)

        elif dlg.result == 11:  # 1/4 - 1/2 - 1/4
            col = Column()
            col.span = 3
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 0)
            col = Column()
            col.span = 6
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 1)
            col = Column()
            col.span = 3
            self.row._columns.append(col)
            ce = ColumnEditor()
            ce.load(col)
            self.addColumn(ce, 2)

        ce = self.getContentEditor()
        if ce:
            ce.editChanged("Add Columns")

    def enableColumnAcceptDrop(self, mode):
        for i in range(self.layout.count()):
            ce = self.layout.itemAt(i).widget()
            if ce:
                ce.setAcceptDrops(mode)

    def mousePressEvent(self, event):
        from widgets.sectioneditor import SectionEditor
        mimeData = WidgetMimeData()
        mimeData.setSize(self.size().width(), self.size().height())
        mimeData.setData(self)
        parent = self.parentWidget()
        if isinstance(parent, SectionEditor):
            mimeData.source_list = parent.section._items

        pixmap = QPixmap(self.size())
        self.render(pixmap)

        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.setHotSpot(event.pos())
        drag.setPixmap(pixmap)

        se = self.parentWidget()
        se.removeRowEditor(self)
        pe = se.parentWidget()
        pe.enableColumnAcceptDrop(False)
        self.hide()

        if drag.exec(Qt.MoveAction) == Qt.IgnoreAction:
            se.addRowEditor(self)
            self.show()

        pe.enableColumnAcceptDrop(True)
Ejemplo n.º 17
0
    def __init__(self, fullwidth):
        QWidget.__init__(self)
        from widgets.hyperlink import HyperLink
        from widgets.flatbutton import FlatButton
        from widgets.section import Section
        from widgets.content import ContentType
        from widgets.elementeditor import ElementEditor, Mode

        self.fullwidth = fullwidth
        self.section = None
        self.id = None
        self.cssclass = None
        self.style = None
        self.attributes = None
        self.setAutoFillBackground(True)
        self.setAcceptDrops(True)
        self.setBGColor()
        vbox = QVBoxLayout()
        vbox.setAlignment(Qt.AlignTop)
        vbox.setSpacing(5)
        self.edit_button = FlatButton(":/images/edit_normal.png",
                                      ":/images/edit_hover.png")
        self.copy_button = FlatButton(":/images/copy_normal.png",
                                      ":/images/copy_hover.png")
        self.delete_button = FlatButton(":/images/trash_normal.png",
                                        ":/images/trash_hover.png")
        self.edit_button.setToolTip("Edit Section")
        self.delete_button.setToolTip("Delete Section")
        self.copy_button.setToolTip("Copy Section")
        self.edit_button.setMaximumWidth(24)
        self.copy_button.setMaximumWidth(24)
        self.delete_button.setMaximumWidth(24)
        vbox.addWidget(self.edit_button)
        vbox.addWidget(self.copy_button)
        vbox.addWidget(self.delete_button)

        vboxRight = QVBoxLayout()
        vboxRight.setAlignment(Qt.AlignLeft)
        layout = QHBoxLayout()
        self.layout = QVBoxLayout()
        layout.addLayout(vbox)
        addRow = HyperLink("(+) Add Row")
        vboxRight.addLayout(self.layout)

        if self.fullwidth:
            ee = ElementEditor()
            ee.elementEnabled.connect(self.addElement)
            ee.elementDragged.connect(self.addElement)

            # connect(ee, SIGNAL(elementCopied(ElementEditor*)), self, SLOT(copyElement(ElementEditor*)))

            self.layout.addWidget(ee, 0, Qt.AlignTop)
        else:
            vboxRight.addWidget(addRow)
        layout.addLayout(vboxRight)
        self.setLayout(layout)

        self.delete_button.clicked.connect(self.delete)
        self.copy_button.clicked.connect(self.copy)
        addRow.clicked.connect(self.addRow)
        self.edit_button.clicked.connect(self.edit)
Ejemplo n.º 18
0
class SectionEditor(QWidget):
    sectionEditorCopied = pyqtSignal(object)

    def __init__(self, fullwidth):
        QWidget.__init__(self)
        from widgets.hyperlink import HyperLink
        from widgets.flatbutton import FlatButton
        from widgets.section import Section
        from widgets.content import ContentType
        from widgets.elementeditor import ElementEditor, Mode

        self.fullwidth = fullwidth
        self.section = None
        self.id = None
        self.cssclass = None
        self.style = None
        self.attributes = None
        self.setAutoFillBackground(True)
        self.setAcceptDrops(True)
        self.setBGColor()
        vbox = QVBoxLayout()
        vbox.setAlignment(Qt.AlignTop)
        vbox.setSpacing(5)
        self.edit_button = FlatButton(":/images/edit_normal.png",
                                      ":/images/edit_hover.png")
        self.copy_button = FlatButton(":/images/copy_normal.png",
                                      ":/images/copy_hover.png")
        self.delete_button = FlatButton(":/images/trash_normal.png",
                                        ":/images/trash_hover.png")
        self.edit_button.setToolTip("Edit Section")
        self.delete_button.setToolTip("Delete Section")
        self.copy_button.setToolTip("Copy Section")
        self.edit_button.setMaximumWidth(24)
        self.copy_button.setMaximumWidth(24)
        self.delete_button.setMaximumWidth(24)
        vbox.addWidget(self.edit_button)
        vbox.addWidget(self.copy_button)
        vbox.addWidget(self.delete_button)

        vboxRight = QVBoxLayout()
        vboxRight.setAlignment(Qt.AlignLeft)
        layout = QHBoxLayout()
        self.layout = QVBoxLayout()
        layout.addLayout(vbox)
        addRow = HyperLink("(+) Add Row")
        vboxRight.addLayout(self.layout)

        if self.fullwidth:
            ee = ElementEditor()
            ee.elementEnabled.connect(self.addElement)
            ee.elementDragged.connect(self.addElement)

            # connect(ee, SIGNAL(elementCopied(ElementEditor*)), self, SLOT(copyElement(ElementEditor*)))

            self.layout.addWidget(ee, 0, Qt.AlignTop)
        else:
            vboxRight.addWidget(addRow)
        layout.addLayout(vboxRight)
        self.setLayout(layout)

        self.delete_button.clicked.connect(self.delete)
        self.copy_button.clicked.connect(self.copy)
        addRow.clicked.connect(self.addRow)
        self.edit_button.clicked.connect(self.edit)

    def edit(self):
        ce = self.getContentEditor()
        if ce:
            ce.sectionEdit(self)

    def addRow(self):
        row = Row()
        self.section._items.append(row)
        re = RowEditor()
        re.load(row)
        self.addRowEditor(re)
        ce = self.getContentEditor()
        if ce:
            ce.editChanged("Add Row")

    def addRowEditor(self, re):
        re.rowEditorCopied.connect(self.copyRowEditor)
        self.layout.addWidget(re)

    def copyRowEditor(self, re):
        ren = RowEditor()
        row = re.row.clone()
        ren.load(row)
        self.section._items.append(row)
        self.addRowEditor(ren)
        ce = self.getContentEditor()
        if ce:
            ce.editChanged("Copy Row")

    def copy(self):
        self.sectionEditorCopied.emit(self)

    def delete(self):
        pe = self.parentWidget()
        if pe:
            pe.removeSection(self)

    def setBGColor(self):
        pal = self.palette()
        if self.fullwidth:
            pal.setColor(QPalette.Background, QColor("#800080"))
        else:
            pal.setColor(QPalette.Background,
                         QColor(self.palette().base().color().name()))
        self.setPalette(pal)

    def addElement(self):
        ee = ElementEditor()
        self.layout.addWidget(ee, 0, Qt.AlignTop)
        ee.elementEnabled.connect(self.addElement)
        ee.elementDragged.connect(self.addElement)
        # connect(ee, SIGNAL(elementCopied(ElementEditor*)), self, SLOT(copyElement(ElementEditor*)))

    def addElementEditor(self, ee):
        ee.elementEnabled.connect(self.addElement)
        ee.elementDragged.connect(self.addElement)

        # connect(ee, SIGNAL(elementCopied(ElementEditor*)), self, SLOT(copyElement(ElementEditor*)))
        self.layout.insertWidget(self.layout.count() - 1, ee, 0, Qt.AlignTop)

    def setSection(self, section):
        self.section = section

    def removeRowEditor(self, re):
        re.setVisible(False)
        self.layout.removeWidget(re)

    def load(self, section):
        from widgets.elementeditor import ElementEditor, Mode
        from widgets.roweditor import RowEditor

        self.section = section
        for item in self.section.items:
            if isinstance(item, Row):
                re = RowEditor()
                re.load(item)
                self.addRowEditor(re)
            else:
                ee = ElementEditor()
                ee.setContent(item)
                ee.setMode(Mode.ENABLED)
                self.addElementEditor(ee)

    def getContentEditor(self):
        pe = self.parentWidget()
        if pe:
            sa = pe.parentWidget()
            if sa:
                vp = sa.parentWidget()
                if vp:
                    cee = vp.parentWidget()
                    if cee:
                        return cee

        return None

    def dragEnterEvent(self, event):
        myData = event.mimeData()
        if myData:
            if not self.section.fullwidth and isinstance(
                    myData.getData(), RowEditor):
                # insert a dropzone at the end
                self.layout.addWidget(DropZone(myData.width, myData.height))
                event.accept()
            elif self.section.fullwidth and isinstance(myData.getData(),
                                                       ElementEditor):
                for i in range(self.layout.count()):
                    editor = self.layout.itemAt(i).widget()
                    if editor and editor.mode == Mode.EMPTY:
                        editor.setMode(Mode.DROPZONE)
                        break
                event.accept()
            else:
                event.ignore()
        else:
            event.ignore()

    def dragLeaveEvent(self, event):
        # remove dropzones
        for i in range(self.layout.count()):
            dz = self.layout.itemAt(i).widget()
            if isinstance(dz, DropZone):
                dz.hide()
                self.layout.removeWidget(dz)
                del dz
                break

            editor = self.layout.itemAt(i).widget()
            if isinstance(editor,
                          ElementEditor) and editor.mode == Mode.DROPZONE:
                # put editor to the end of the list
                editor.setMode(Mode.EMPTY)
                self.layout.removeWidget(editor)
                self.layout.addWidget(editor)
                break
        event.accept()

    def dragMoveEvent(self, event):
        myData = event.mimeData()
        if myData:
            re = myData.getData()
            if isinstance(re, RowEditor):
                height = 0
                row = 0

                # evaluate position for the dropzone to be placed
                for i in range(self.layout.count()):
                    editor = self.layout.itemAt(i).widget()
                    if isinstance(editor, RowEditor):
                        if event.pos().y() > height and event.pos().y(
                        ) < height + editor.height():
                            break
                        height += editor.height()
                        row = row + 1

                # find dropzone and replace it to location
                for i in range(self.layout.count()):
                    dz = self.layout.itemAt(i).widget()
                    if isinstance(dz, DropZone):
                        if i != row:
                            self.layout.insertWidget(row, dz)
                        break

                event.setDropAction(Qt.MoveAction)
                event.accept()
            else:
                ee = myData.getData()
                if ee:
                    row = event.pos().y() / 50
                    for i in range(self.layout.count()):
                        editor = self.layout.itemAt(i).widget()
                        if editor and editor.mode == Mode.DROPZONE:
                            if i != row:
                                # put dropzone under mouse pointer
                                self.layout.insertWidget(row, editor)
                            break
                    event.setDropAction(Qt.MoveAction)
                    event.accept()
                else:
                    event.ignore()
        else:
            event.ignore()

    def dropEvent(self, event):
        myData = event.mimeData()
        if myData:
            re = myData.getData()
            if isinstance(re, RowEditor):
                # place the dragged RowEditor to the place where DropZone is now
                for i in range(self.layout.count()):
                    dz = self.layout.itemAt(i).widget()
                    if isinstance(dz, DropZone):
                        dz.hide()
                        self.layout.replaceWidget(dz, re)
                        new_pos = i
                        re.show()
                        del dz
                        break

                ce = self.getContentEditor()
                if ce:
                    myData.source_list.remove(re.row)
                    self.section.insertElement(re.row, new_pos)
                    ce.editChanged("Move Row")
                event.setDropAction(Qt.MoveAction)
                event.accept()
            else:
                ee = myData.getData()
                if isinstance(ee, ElementEditor):
                    for i in range(self.layout.count()):
                        dz = self.layout.itemAt(i).widget()
                        if isinstance(
                                dz,
                                ElementEditor) and dz.mode == Mode.DROPZONE:
                            # remove widget if it belongs to self layout
                            self.layout.removeWidget(ee)

                            # replace dropzone with dragged element
                            self.layout.replaceWidget(dz, ee)
                            new_pos = i
                            # and put dropzone to the end of the list
                            dz.setMode(Mode.EMPTY)
                            self.layout.removeWidget(dz)
                            self.layout.addWidget(dz)
                            break
                    ee.dropped()
                    ee.show()
                    ee.elementEnabled.disconnect()
                    ee.elementDragged.disconnect()
                    # ee.elementCopied.disconnect()
                    ee.elementEnabled.connect(self.addElement)
                    ee.elementDragged.connect(self.addElement)
                    # ee.elementCopied.connect(self.copyElement)

                    ce = self.getContentEditor()
                    if ce:
                        myData.source_list.remove(ee.content)
                        self.section.insertElement(ee.content, new_pos)
                        ce.editChanged("Move Element")
                    event.setDropAction(Qt.MoveAction)
                    event.accept()
                else:
                    event.ignore()
        else:
            event.ignore()

    def enableColumnAcceptDrop(self, mode):
        for i in range(self.layout.count()):
            re = self.layout.itemAt(i).widget()
            if isinstance(re, RowEditor):
                re.enableColumnAcceptDrop(mode)

    def mousePressEvent(self, event):
        mimeData = WidgetMimeData()
        mimeData.setSize(self.size().width(), self.size().height())
        mimeData.setData(self)

        pixmap = QPixmap(self.size())
        self.render(pixmap)

        drag = QDrag(self)
        drag.setMimeData(mimeData)
        drag.setHotSpot(event.pos())
        drag.setPixmap(pixmap)

        pe = self.parentWidget()
        pe.removeSectionEditor(self)
        pe.enableColumnAcceptDrop(False)
        pe.enableSectionAcceptDrop(False)
        self.hide()

        if drag.exec(Qt.MoveAction) == Qt.IgnoreAction:
            pe.addSection(self)
            self.show()

        pe.enableColumnAcceptDrop(True)
        pe.enableSectionAcceptDrop(True)

    def removeElement(self, content):
        self.section._items.remove(content)
Ejemplo n.º 19
0
class MainWindow(QMainWindow):
    siteLoaded = pyqtSignal(object)

    def __init__(self):
        QMainWindow.__init__(self)
        self.site = None
        self.editor = ""
        self.install_directory = os.getcwd()
        self.content_after_animation = ""
        self.default_path = ""
        self.method_after_animation = ""

        Generator.install_directory = self.install_directory

        self.initUndoRedo()
        self.initGui()
        self.readSettings()
        self.loadPlugins()

        if self.default_path:
            if self.loadProject(os.path.join(self.default_path, "Site.qml")):
                gen = Generator()
                gen.generateSite(self, self.site)

        self.dashboard.setExpanded(True)
        self.showDashboard()
        self.statusBar().showMessage(
            QCoreApplication.translate("MainWindow", "Ready"))

    def actualThemeChanged(self, themename):
        self.theme_settings_button.setVisible(False)
        for name in Plugins.themePluginNames():
            tei = Plugins.getThemePlugin(name)
            if tei:
                if tei.theme_name == themename:
                    self.theme_settings_button.setVisible(True)
                    break

    def loadProject(self, filename):
        self.default_path = filename[0:-9]  # - /Site.qml
        if self.reloadProject(filename):
            # create temp dir for undo redo
            tempPath = self.site.source_path[self.site.source_path.rfind("/") +
                                             1:]
            temp = QDir(os.path.join(QDir.tempPath(), "FlatSiteBuilder"))
            temp.mkdir(tempPath)
            temp.cd(tempPath)
            temp.mkdir("pages")
            temp.mkdir("posts")

            # in case these subfolders were empty and not published to github
            dir = QDir(self.site.source_path)
            dir.mkdir("pages")
            dir.mkdir("posts")
            dir.mkdir("assets")
            dir.cd("assets")
            dir.mkdir("images")
            return True
        else:
            return False

    def initUndoRedo(self):
        self.undoStack = QUndoStack()
        temp = QDir(os.path.join(QDir.tempPath(), "FlatSiteBuilder"))
        if temp.exists():
            temp.removeRecursively()
        temp.setPath(QDir.tempPath())
        temp.mkdir("FlatSiteBuilder")

    def initGui(self):
        self.installEventFilter(self)
        self.dashboard = Expander(
            QCoreApplication.translate("MainWindow", "Dashboard"),
            ":/images/dashboard_normal.png", ":/images/dashboard_hover.png",
            ":/images/dashboard_selected.png")
        self.content = Expander(
            QCoreApplication.translate("MainWindow",
                                       "Content"), ":/images/pages_normal.png",
            ":/images/pages_hover.png", ":/images/pages_selected.png")
        self.appearance = Expander(
            QCoreApplication.translate("MainWindow", "Appearance"),
            ":/images/appearance_normal.png", ":/images/appearance_hover.png",
            ":/images/appearance_selected.png")
        self.settings = Expander(
            QCoreApplication.translate("MainWindow", "Settings"),
            ":/images/settings_normal.png", ":/images/settings_hover.png",
            ":/images/settings_selected.png")

        self.setWindowTitle(QCoreApplication.applicationName() + " " +
                            QCoreApplication.applicationVersion())
        vbox = QVBoxLayout()
        vbox.addWidget(self.dashboard)
        vbox.addWidget(self.content)
        vbox.addWidget(self.appearance)
        vbox.addWidget(self.settings)
        vbox.addStretch()

        content_box = QVBoxLayout()
        pages_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Pages"))
        posts_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Posts"))
        content_box.addWidget(pages_button)
        content_box.addWidget(posts_button)
        self.content.addLayout(content_box)

        app_box = QVBoxLayout()
        themes_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Themes"))
        menus_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Menus"))
        self.theme_settings_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Theme Settings"))
        self.theme_settings_button.setVisible(False)
        app_box.addWidget(menus_button)
        app_box.addWidget(themes_button)
        app_box.addWidget(self.theme_settings_button)

        self.appearance.addLayout(app_box)

        scroll_content = QWidget()
        scroll_content.setLayout(vbox)
        scroll = QScrollArea()
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setWidget(scroll_content)
        scroll.setWidgetResizable(True)
        scroll.setMaximumWidth(200)
        scroll.setMinimumWidth(200)

        self.navigationdock = QDockWidget(
            QCoreApplication.translate("MainWindow", "Navigation"), self)
        self.navigationdock.setAllowedAreas(Qt.LeftDockWidgetArea
                                            | Qt.RightDockWidgetArea)
        self.navigationdock.setWidget(scroll)
        self.navigationdock.setObjectName("Navigation")

        self.addDockWidget(Qt.LeftDockWidgetArea, self.navigationdock)

        self.showDock = FlatButton(":/images/edit_normal.png",
                                   ":/images/edit_hover.png")
        self.showDock.setToolTip(
            QCoreApplication.translate("MainWindow", "Show Navigation"))
        self.statusBar().addPermanentWidget(self.showDock)

        self.dashboard.expanded.connect(self.dashboardExpanded)
        self.dashboard.clicked.connect(self.showDashboard)
        self.content.expanded.connect(self.contentExpanded)
        self.content.clicked.connect(self.showPages)
        self.appearance.expanded.connect(self.appearanceExpanded)
        self.appearance.clicked.connect(self.showMenus)
        self.settings.expanded.connect(self.settingsExpanded)
        self.settings.clicked.connect(self.showSettings)
        menus_button.clicked.connect(self.showMenus)
        pages_button.clicked.connect(self.showPages)
        posts_button.clicked.connect(self.showPosts)
        themes_button.clicked.connect(self.showThemes)
        self.theme_settings_button.clicked.connect(self.showThemesSettings)
        self.showDock.clicked.connect(self.showMenu)
        self.navigationdock.visibilityChanged.connect(
            self.dockVisibilityChanged)

    def showDashboard(self):
        if self.editor:
            self.method_after_animation = "showDashboard"
            self.editor.closeEditor()
            return

        db = Dashboard(self.site, self.default_path)
        db.loadSite.connect(self.loadProject)
        db.previewSite.connect(self.previewSite)
        db.publishSite.connect(self.publishSite)
        db.createSite.connect(self.createSite)
        db.buildSite.connect(self.buildSite)

        self.siteLoaded.connect(db.siteLoaded)
        self.setCentralWidget(db)

    def setCentralWidget(self, widget):
        # do not delete plugin editors
        old_widget = self.takeCentralWidget()
        if not isinstance(old_widget, PublisherInterface) and not isinstance(
                old_widget, ThemeEditorInterface):
            del old_widget
        super().setCentralWidget(widget)
        widget.show()

    def closeEvent(self, event):
        self.writeSettings()
        event.accept()

    def writeSettings(self):
        settings = QSettings(QSettings.IniFormat, QSettings.UserScope,
                             QCoreApplication.organizationName(),
                             QCoreApplication.applicationName())
        settings.setValue("geometry", self.saveGeometry())
        settings.setValue("state", self.saveState())
        if self.site:
            settings.setValue("lastSite", self.site.source_path)

    def readSettings(self):
        settings = QSettings(QSettings.IniFormat, QSettings.UserScope,
                             QCoreApplication.organizationName(),
                             QCoreApplication.applicationName())
        geometry = settings.value("geometry", QByteArray())
        if geometry.isEmpty():
            availableGeometry = QApplication.desktop().availableGeometry(self)
            self.resize(int(availableGeometry.width() / 2),
                        int(availableGeometry.height() / 2))
            self.move(int(((availableGeometry.width() - self.width()) / 2)),
                      int((availableGeometry.height() - self.height()) / 2))
        else:
            self.restoreGeometry(geometry)
            self.restoreState(settings.value("state"))
        self.default_path = settings.value("lastSite")

    def reloadProject(self, filename):
        sys.stdout.flush()
        engine = QQmlEngine()
        self.site_component = component = QQmlComponent(engine)
        self.site_component.loadUrl(QUrl.fromLocalFile(filename))
        self.site = self.site_component.create()
        if self.site is not None:
            self.site.setFilename(filename)
            self.site.setWindow(self)
        else:
            for error in self.site_component.errors():
                print(error.toString())
            return False
        if self.site.output == "":
            self.site.output = "docs"
        self.site.loadMenus()
        self.site.loadPages()
        self.site.loadPosts()

        self.theme_settings_button.setVisible(False)
        Plugins.setActualThemeEditorPlugin("")
        for key in Plugins.themePluginNames():
            tei = Plugins.getThemePlugin(key)
            if tei:
                if tei.theme_name == self.site.theme:
                    Plugins.setActualThemeEditorPlugin(tei.class_name)
                    self.theme_settings_button.setVisible(True)
                    break

        #if not self.site.publisher:
        #    if len(Plugins.publishPluginNames()) > 0:
        #        self.site.publisher = Plugins.publishPluginNames[0]

        Plugins.setActualPublishPlugin(self.site.publisher)
        self.siteLoaded.emit(self.site)
        return True

    def dashboardExpanded(self, value):
        if value:
            self.content.setExpanded(False)
            self.appearance.setExpanded(False)
            self.settings.setExpanded(False)

    def contentExpanded(self, value):
        if value:
            self.dashboard.setExpanded(False)
            self.appearance.setExpanded(False)
            self.settings.setExpanded(False)

    def appearanceExpanded(self, value):
        if value:
            self.dashboard.setExpanded(False)
            self.content.setExpanded(False)
            self.settings.setExpanded(False)

    def settingsExpanded(self, value):
        if value:
            self.dashboard.setExpanded(False)
            self.content.setExpanded(False)
            self.appearance.setExpanded(False)

    def showMenus(self):
        if self.editor:
            self.method_after_animation = "showMenus"
            self.editor.closeEditor()
            return

        edit = MenuList(self, self.site)
        edit.editContent.connect(self.editMenu)
        self.setCentralWidget(edit)

    def showPages(self):
        if self.editor:
            self.method_after_animation = "showPages"
            self.editor.closeEditor()
            return

        list = ContentList(self.site, ContentType.PAGE)
        list.editContent.connect(self.editContent)
        self.setCentralWidget(list)

    def showPosts(self):
        if self.editor:
            self.method_after_animation = "showPosts"
            self.editor.closeEditor()
            return

        list = ContentList(self.site, ContentType.POST)
        list.editContent.connect(self.editContent)
        self.setCentralWidget(list)

    def showThemes(self):
        if self.editor:
            self.method_after_animation = "showThemes"
            self.editor.closeEditor()
            return

        tc = ThemeChooser(self, self.site)
        self.setCentralWidget(tc)

    def showThemesSettings(self):
        tei = Plugins.getThemePlugin(Plugins.actualThemeEditorPlugin())
        if tei:
            if self.editor:
                self.method_after_animation = "showThemesSettings"
                self.editor.closeEditor()
                return

            path = self.site.source_path
            tei.setWindow(self)
            tei.setSourcePath(path)
            self.setCentralWidget(tei)
        else:
            self.statusBar().showMessage(
                QCoreApplication.translate("MainWindow",
                                           "Unable to load plugin") + " " +
                Plugins.actualThemeEditorPlugin())

    def showSettings(self):
        if self.editor:
            self.method_after_animation = "showSettings"
            self.editor.closeEditor()
            return

        sse = SiteSettingsEditor(self, self.site)
        self.setCentralWidget(sse)

    def showMenu(self):
        self.navigationdock.setVisible(True)

    def dockVisibilityChanged(self, visible):
        self.showDock.setVisible(not visible)

    def previewSite(self, content=None):
        if self.editor and content:
            self.content_after_animation = content
            self.editor.closeEditor()
            return

        dir = os.path.join(self.default_path, self.site.output)

        if not content:
            if len(self.site.pages) > 0:
                content = self.site.pages[0]
                for c in self.site.pages:
                    if c.url == "index.html":
                        content = c
                        break
            elif len(self.site.posts) > 0:
                content = self.site.posts()[0]

        if content:
            file = content.url
            self.webView = QWebEngineView()
            self.webView.loadFinished.connect(self.webViewLoadFinished)
            url = pathlib.Path(os.path.join(dir, file)).as_uri()
            self.webView.setUrl(QUrl(url))
            self.setCursor(Qt.WaitCursor)
        else:
            self.statusBar().showMessage(
                QCoreApplication.translate(
                    "MainWindow", "Site has no pages or posts to preview."))

    def webViewLoadFinished(self, success):
        if success:
            self.setCentralWidget(self.webView)
            self.webView.loadFinished.disconnect(self.webViewLoadFinished)
        else:
            QMessageBox.warning(
                self, "FlatSiteBuilder",
                QCoreApplication.translate("MainWindow",
                                           "Unable to open webpage."))
        self.setCursor(Qt.ArrowCursor)

    def publishSite(self):
        pluginName = Plugins.actualPublishPlugin()
        pi = Plugins.getPublishPlugin(pluginName)
        if pi:
            self.setCentralWidget(pi)
            pi.setSitePath(self.install_directory, self.site.source_path)
        else:
            QMessageBox.warning(
                self, "FlatSiteBuilder",
                QCoreApplication.translate(
                    "MainWindow", "Website has no publish plugin configured."))

    def createSite(self):
        wiz = SiteWizard(self.install_directory, parent=self)
        wiz.loadSite.connect(self.loadProject)
        wiz.buildSite.connect(self.buildSite)
        wiz.show()

    def buildSite(self):
        self.site.loadMenus()
        self.site.loadPages()
        self.site.loadPosts()
        if len(self.site.pages) == 0 and len(self.site.posts) == 0:
            self.statusBar().showMessage(
                QCoreApplication.translate(
                    "MainWindow", "Site has no pages or posts to build."))
        else:
            gen = Generator()
            gen.generateSite(self, self.site)
            self.statusBar().showMessage(
                self.site.title + " " +
                QCoreApplication.translate("MainWindow", "has been generated"))

    def editMenu(self, item):
        menu = item.data(Qt.UserRole)
        me = MenuEditor(self, menu, self.site)
        self.editor = me
        list = self.centralWidget()
        if list:
            list.registerMenuEditor(me)
            list.editedItemChanged.connect(self.editedItemChanged)

        self.editor.closes.connect(self.editorClosed)
        self.editor.contentChanged.connect(self.menuChanged)
        self.animate(item)

    def editContent(self, item):
        content = item.data(Qt.UserRole)
        self.editor = ContentEditor(self, self.site, content)
        self.siteLoaded.connect(self.editor.siteLoaded)
        self.editor.closes.connect(self.editorClosed)
        self.editor.preview.connect(self.previewSite)
        self.animate(item)

    def animate(self, item):
        panel = self.centralWidget()
        self.list = item.tableWidget()
        self.row = item.row()

        # create a cell widget to get the right position in the table
        self.cellWidget = QWidget()
        self.cellWidget.setMaximumHeight(0)
        self.list.setCellWidget(self.row, 1, self.cellWidget)
        pos = self.cellWidget.mapTo(panel, QPoint(0, 0))

        self.editor.setParent(panel)
        self.editor.move(pos)
        self.editor.resize(self.cellWidget.size())
        self.editor.show()

        self.animation = QPropertyAnimation(self.editor,
                                            "geometry".encode("utf-8"))
        self.animation.setDuration(300)
        self.animation.setStartValue(
            QRect(pos.x(), pos.y(),
                  self.cellWidget.size().width(),
                  self.cellWidget.size().height()))
        self.animation.setEndValue(
            QRect(0, 0,
                  panel.size().width(),
                  panel.size().height()))
        self.animation.start()

    def eventFilter(self, watched, event):
        if watched == self and event.type() == QEvent.Resize and self.editor:
            w = self.centralWidget()
            if w:
                self.editor.resize(w.size())
        return False

    def editorClosed(self):
        pos = self.cellWidget.mapTo(self.centralWidget(), QPoint(0, 0))
        # correct end values in case of resizing the window
        self.animation.setStartValue(
            QRect(pos.x(), pos.y(),
                  self.cellWidget.size().width(),
                  self.cellWidget.size().height()))
        self.animation.finished.connect(self.animationFineshedZoomOut)
        self.animation.setDirection(QAbstractAnimation.Backward)
        self.animation.start()

    def animationFineshedZoomOut(self):
        self.list.removeCellWidget(self.row, 1)
        del self.animation

        # in the case self.editor was a MenuEditor, we have to unregister it in the MenuList
        # should be refactored some day :-)
        list = self.centralWidget()
        if list is MenuEditor:
            list.unregisterMenuEditor()

        if isinstance(list, ContentList):
            list.reload()

        del self.editor
        self.editor = None

        if self.method_after_animation == "showDashboard":
            self.showDashboard()
            self.method_after_animation = ""
        elif self.method_after_animation == "showSettings":
            self.showSettings()
        elif self.method_after_animation == "showThemesSettings":
            self.showThemesSettings()
        elif self.method_after_animation == "showThemes":
            self.showThemes()
        elif self.method_after_animation == "showMenus":
            self.showMenus()
        elif self.method_after_animation == "showPages":
            self.showPages()
        elif self.method_after_animation == "showPosts":
            self.showPosts()

        if self.content_after_animation:
            self.previewSite(self.content_after_animation)
            self.content_after_animation = None

    def contentChanged(self, content):
        self.list.item(self.row, 1).setText(content.title())
        self.list.item(self.row, 2).setText(content.source())
        self.list.item(self.row, 3).setText(content.layout())
        self.list.item(self.row, 4).setText(content.author())
        self.list.item(self.row,
                       5).setText(content.date().toString("dd.MM.yyyy"))

    def menuChanged(self, menu):
        self.list.item(self.row, 1).setText(menu.name())

    def editedItemChanged(self, item):
        # this will happen, if the MenuList.reloadMenu() has been called by the undo.command
        self.list = item.tableWidget()
        self.row = item.row()
        self.cellWidget = QWidget()
        self.list.setCellWidget(self.row, 1, self.cellWidget)

    def loadPlugins(self):
        # check if we are running in a frozen environment (pyinstaller --onefile)
        if getattr(sys, "frozen", False):
            bundle_dir = sys._MEIPASS
            # if we are running in a onefile environment, then copy all plugin to /tmp/...
            if bundle_dir != os.getcwd():
                os.mkdir(os.path.join(bundle_dir, "plugins"))
                for root, dirs, files in os.walk(
                        os.path.join(os.getcwd(), "plugins")):
                    for file in files:
                        shutil.copy(os.path.join(root, file),
                                    os.path.join(bundle_dir, "plugins"))
                        print("copy", file)
                    break  # do not copy __pycache__
        else:
            bundle_dir = os.getcwd()

        plugins_dir = os.path.join(bundle_dir, "plugins")
        for root, dirs, files in os.walk(plugins_dir):
            for file in files:
                modulename, ext = os.path.splitext(file)
                if ext == ".py":
                    module = import_module("plugins." + modulename)
                    for name, klass in inspect.getmembers(
                            module, inspect.isclass):
                        if klass.__module__ == "plugins." + modulename:
                            instance = klass()
                            if isinstance(instance, ElementEditorInterface):
                                Plugins.addElementPlugin(name, instance)
                                instance.registerContenType()
                            elif isinstance(instance, ThemeEditorInterface):
                                Plugins.addThemePlugin(name, instance)
                            elif isinstance(instance, PublisherInterface):
                                Plugins.addPublishPlugin(name, instance)
                            elif isinstance(instance, GeneratorInterface):
                                Plugins.addGeneratorPlugin(name, instance)
            break  # not to list __pycache__
Ejemplo n.º 20
0
class ContentList(QWidget):
    editContent = pyqtSignal(object)

    def __init__(self, site, type):
        QWidget.__init__(self)
        self.site = site
        self.addedContentName = ""
        self.type = type
        self.undoStack = QUndoStack()
        vbox = QVBoxLayout()
        layout = QGridLayout()
        titleLabel = QLabel()
        button = QPushButton()
        if self.type == ContentType.PAGE:
            button.setText("Add Page")
        else:
            button.setText("Add Post")
        button.setMaximumWidth(120)
        if self.type == ContentType.PAGE:
            titleLabel.setText("Pages")
        else:
            titleLabel.setText("Posts")
        fnt = titleLabel.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        titleLabel.setFont(fnt)

        self.undo = FlatButton(":/images/undo_normal.png",
                               ":/images/undo_hover.png", "",
                               ":/images/undo_disabled.png")
        self.redo = FlatButton(":/images/redo_normal.png",
                               ":/images/redo_hover.png", "",
                               ":/images/redo_disabled.png")
        self.undo.setToolTip("Undo")
        self.redo.setToolTip("Redo")
        self.undo.setEnabled(False)
        self.redo.setEnabled(False)
        hbox = QHBoxLayout()
        hbox.addStretch(0)
        hbox.addWidget(self.undo)
        hbox.addWidget(self.redo)

        self.list = QTableWidget(0, 6, self)
        self.list.verticalHeader().hide()
        self.list.setSelectionMode(QAbstractItemView.SingleSelection)
        self.list.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.list.horizontalHeader().setSectionResizeMode(
            1, QHeaderView.Stretch)
        self.list.setToolTip("Double click to edit item")
        labels = ["", "Name", "Source", "Layout", "Author", "Date"]
        self.list.setHorizontalHeaderLabels(labels)

        self.reload()

        layout.addWidget(titleLabel, 0, 0)
        layout.addLayout(hbox, 0, 2)
        layout.addWidget(button, 1, 0)
        layout.addWidget(self.list, 2, 0, 1, 3)
        vbox.addLayout(layout)
        self.setLayout(vbox)

        button.clicked.connect(self.addPage)
        self.list.cellDoubleClicked.connect(self.tableDoubleClicked)
        self.redo.clicked.connect(self.doredo)
        self.undo.clicked.connect(self.doundo)
        self.undoStack.canUndoChanged.connect(self.canUndoChanged)
        self.undoStack.canRedoChanged.connect(self.canRedoChanged)
        self.undoStack.redoTextChanged.connect(self.redoTextChanged)

    def reload(self):
        self.list.setRowCount(0)
        row = -1

        itemToEdit = None
        if self.type == ContentType.PAGE:
            self.site.loadPages()
            for i in range(len(self.site.pages)):
                content = self.site.pages[i]
                self.addListItem(content)
                if content.source == self.addedContentName:
                    row = self.list.rowCount() - 1
                    itemToEdit = self.list.item(row, 1)
        else:
            self.site.loadPosts()
            for i in range(0, len(self.site.posts)):
                content = self.site.posts[i]
                self.addListItem(content)
                if content.source == self.addedContentName:
                    row = self.list.rowCount() - 1

        if itemToEdit:
            self.addedContentName = ""
            self.list.selectRow(row)
            self.editContent.emit(itemToEdit)

    def addListItem(self, content):
        rows = self.list.rowCount()
        self.list.setRowCount(rows + 1)
        tcb = TableCellButtons()
        tcb.setItem(content)
        tcb.deleteItem.connect(self.deleteContent)
        tcb.editItem.connect(self.edit)
        self.list.setCellWidget(rows, 0, tcb)
        self.list.setRowHeight(rows, tcb.sizeHint().height())
        titleItem = QTableWidgetItem(content.title)
        titleItem.setFlags(titleItem.flags() ^ Qt.ItemIsEditable)
        titleItem.setData(Qt.UserRole, content)
        self.list.setItem(rows, 1, titleItem)

        sourceItem = QTableWidgetItem(content.source)
        sourceItem.setFlags(titleItem.flags() ^ Qt.ItemIsEditable)
        self.list.setItem(rows, 2, sourceItem)

        layoutItem = QTableWidgetItem(content.layout)
        layoutItem.setFlags(layoutItem.flags() ^ Qt.ItemIsEditable)
        self.list.setItem(rows, 3, layoutItem)

        authorItem = QTableWidgetItem(content.author)
        authorItem.setFlags(authorItem.flags() ^ Qt.ItemIsEditable)
        self.list.setItem(rows, 4, authorItem)
        dateItem = QTableWidgetItem(content.date.toString("dd.MM.yyyy"))
        dateItem.setFlags(dateItem.flags() ^ Qt.ItemIsEditable)
        self.list.setItem(rows, 5, dateItem)

    def canUndoChanged(self, can):
        self.undo.setEnabled(can)

    def canRedoChanged(self, can):
        self.redo.setEnabled(can)

    def undoTextChanged(self, text):
        self.undo.setToolTip("Undo " + text)

    def redoTextChanged(self, text):
        self.redo.setToolTip("Redo " + text)

    def doundo(self):
        self.undoStack.undo()

    def doredo(self):
        self.undoStack.redo()

    def addPage(self):
        self.addedContentName = self.site.createTemporaryContent(self.type)
        info = QFileInfo(self.addedContentName)
        self.addedContentName = info.fileName()
        self.reload()

    def tableDoubleClicked(self, r, i):
        item = self.list.item(r, 1)
        self.undoStack.clear()
        self.editContent.emit(item)

    def edit(self, content):
        for row in range(self.list.rowCount()):
            item = self.list.item(row, 1)
            m = item.data(Qt.UserRole)
            if m == content:
                self.list.selectRow(row)
                self.undoStack.clear()
                self.editContent.emit(item)
                break

    def deleteContent(self, content):
        for row in range(self.list.rowCount()):
            item = self.list.item(row, 1)
            m = item.data(Qt.UserRole)
            if m == content:
                if m.content_type == ContentType.PAGE:
                    subdir = "pages"
                else:
                    subdir = "posts"
                delCommand = DeleteContentCommand(
                    self, os.path.join(self.site.source_path, subdir,
                                       m.source), "delete content " + m.title)
                self.undoStack.push(delCommand)
                break
Ejemplo n.º 21
0
    def __init__(self, win, menu, site):
        AnimateableEditor.__init__(self)
        self.win = win
        self.menu = menu
        self.site = site
        self.changed = False

        self.setAutoFillBackground(True)

        titleLabel = QLabel("Menu Editor")
        fnt = titleLabel.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        titleLabel.setFont(fnt)

        self.close = FlatButton(":/images/close_normal.png",
                                ":/images/close_hover.png")
        self.close.setToolTip("Close Content Editor")
        self.undo = FlatButton(":/images/undo_normal.png",
                               ":/images/undo_hover.png", "",
                               ":/images/undo_disabled.png")
        self.redo = FlatButton(":/images/redo_normal.png",
                               ":/images/redo_hover.png", "",
                               ":/images/redo_disabled.png")
        self.undo.setToolTip("Undo")
        self.redo.setToolTip("Redo")
        self.undo.setEnabled(False)
        self.redo.setEnabled(False)
        hbox = QHBoxLayout()
        hbox.addStretch(0)
        hbox.addWidget(self.undo)
        hbox.addWidget(self.redo)
        hbox.addWidget(self.close)

        addButton = QPushButton("Add Menuitem")
        addButton.setMaximumWidth(120)

        self.name = QLineEdit()
        self.name.setText(menu.name)
        self.name.setMaximumWidth(200)

        labels = ["Title", "Url", "Icon", "", "Sort"]

        self.tree = QTreeWidget()
        self.tree.setHeaderLabels(labels)
        self.tree.header().setSectionResizeMode(0, QHeaderView.Stretch)
        self.tree.header().hideSection(4)
        self.tree.setSelectionMode(QAbstractItemView.NoSelection)
        self.tree.setToolTip("Double Click To Edit")
        self.tree.setColumnWidth(2, 40)

        layout = QGridLayout()
        layout.addWidget(titleLabel, 0, 0)
        layout.addLayout(hbox, 0, 2)
        layout.addWidget(QLabel("Name"), 1, 0)
        layout.addWidget(self.name, 2, 0)
        layout.addWidget(addButton, 3, 0)
        layout.addWidget(self.tree, 4, 0, 1, 3)
        self.setLayout(layout)

        self.reloadMenu(menu)

        addButton.clicked.connect(self.addButtonClicked)
        self.close.clicked.connect(self.closeEditor)
        self.name.editingFinished.connect(self.nameChanged)
        self.redo.clicked.connect(self.redoEdit)
        self.undo.clicked.connect(self.undoEdit)
        self.tree.itemChanged.connect(self.itemChanged)
Ejemplo n.º 22
0
class MenuEditor(AnimateableEditor):
    contentChanged = pyqtSignal(object)
    menuChanged = pyqtSignal(str)

    def __init__(self, win, menu, site):
        AnimateableEditor.__init__(self)
        self.win = win
        self.menu = menu
        self.site = site
        self.changed = False

        self.setAutoFillBackground(True)

        titleLabel = QLabel("Menu Editor")
        fnt = titleLabel.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        titleLabel.setFont(fnt)

        self.close = FlatButton(":/images/close_normal.png",
                                ":/images/close_hover.png")
        self.close.setToolTip("Close Content Editor")
        self.undo = FlatButton(":/images/undo_normal.png",
                               ":/images/undo_hover.png", "",
                               ":/images/undo_disabled.png")
        self.redo = FlatButton(":/images/redo_normal.png",
                               ":/images/redo_hover.png", "",
                               ":/images/redo_disabled.png")
        self.undo.setToolTip("Undo")
        self.redo.setToolTip("Redo")
        self.undo.setEnabled(False)
        self.redo.setEnabled(False)
        hbox = QHBoxLayout()
        hbox.addStretch(0)
        hbox.addWidget(self.undo)
        hbox.addWidget(self.redo)
        hbox.addWidget(self.close)

        addButton = QPushButton("Add Menuitem")
        addButton.setMaximumWidth(120)

        self.name = QLineEdit()
        self.name.setText(menu.name)
        self.name.setMaximumWidth(200)

        labels = ["Title", "Url", "Icon", "", "Sort"]

        self.tree = QTreeWidget()
        self.tree.setHeaderLabels(labels)
        self.tree.header().setSectionResizeMode(0, QHeaderView.Stretch)
        self.tree.header().hideSection(4)
        self.tree.setSelectionMode(QAbstractItemView.NoSelection)
        self.tree.setToolTip("Double Click To Edit")
        self.tree.setColumnWidth(2, 40)

        layout = QGridLayout()
        layout.addWidget(titleLabel, 0, 0)
        layout.addLayout(hbox, 0, 2)
        layout.addWidget(QLabel("Name"), 1, 0)
        layout.addWidget(self.name, 2, 0)
        layout.addWidget(addButton, 3, 0)
        layout.addWidget(self.tree, 4, 0, 1, 3)
        self.setLayout(layout)

        self.reloadMenu(menu)

        addButton.clicked.connect(self.addButtonClicked)
        self.close.clicked.connect(self.closeEditor)
        self.name.editingFinished.connect(self.nameChanged)
        self.redo.clicked.connect(self.redoEdit)
        self.undo.clicked.connect(self.undoEdit)
        self.tree.itemChanged.connect(self.itemChanged)

    def reloadMenu(self, menu):
        if not menu:
            self.close.emit()
            return

        self.menu = menu
        self.tree.clear()

        self.name.setText(menu.name)
        for i in range(0, len(self.menu.items)):
            item = self.menu.items[i]
            self.addTreeItem(item)

        self.tree.expandAll()
        self.tree.sortItems(4, Qt.AscendingOrder)
        self.updateButtonStates()

    def addTreeItem(self, item):
        twi = QTreeWidgetItem()
        twi.setFlags(twi.flags() | Qt.ItemIsEditable)
        twi.setText(0, item.title)
        twi.setText(1, item.url)

        twi.setText(4, str(self.tree.topLevelItemCount()))
        twi.setData(0, Qt.UserRole, item)
        self.tree.addTopLevelItem(twi)
        self.addTableCellButtons(item, twi)

        for i in range(len(item.items)):
            sub = item.items[i]
            stwi = QTreeWidgetItem()
            stwi.setFlags(stwi.flags() | Qt.ItemIsEditable)
            stwi.setText(0, sub.title)
            stwi.setText(1, sub.url)
            stwi.setText(4, str(i))
            stwi.setData(0, Qt.UserRole, sub)
            twi.addChild(stwi)
            self.addTableCellButtons(sub, stwi)

    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 registerUndoStack(self, stack):
        self.undoStack = stack
        self.undoStack.canUndoChanged.connect(self.canUndoChanged)
        self.undoStack.canRedoChanged.connect(self.canRedoChanged)
        self.undoStack.undoTextChanged.connect(self.undoTextChanged)
        self.undoStack.redoTextChanged.connect(self.redoTextChanged)
        self.undo.setEnabled(self.undoStack.canUndo())
        self.redo.setEnabled(self.undoStack.canRedo())
        self.undo.setToolTip("Undo " + self.undoStack.undoText())
        self.redo.setToolTip("Redo " + self.undoStack.redoText())

    def canUndoChanged(self, can):
        self.undo.setEnabled(can)

    def canRedoChanged(self, can):
        self.redo.setEnabled(can)

    def undoTextChanged(self, text):
        self.undo.setToolTip("Undo " + text)

    def redoTextChanged(self, text):
        self.redo.setToolTip("Redo " + text)

    def getUndoRedoText(self, item, action):
        return "menuitem (" + item.title + ") from menu (" + self.menu.name + ") " + action

    def undoEdit(self):
        self.undoStack.undo()

    def redoEdit(self):
        self.undoStack.redo()

    def addButtonClicked(self):
        menuitem = MenuItem()
        self.menu.addMenuitem(menuitem)
        self.addTreeItem(menuitem)
        self.menuChanged.emit(self.getUndoRedoText(menuitem, "added"))

        self.updateButtonStates()
        item = self.tree.topLevelItem(self.getRow(menuitem))
        self.tree.editItem(item, 0)

    def closeEditor(self):
        self.closes.emit()

    def nameChanged(self):
        if self.menu.name != self.name.text:
            action = "menu name changed from \"" + self.menu.name + "\" to \"" + self.name.text + "\""
            self.menu.setName(self.name.text())
            self.contentChanged.emit(self.menu)
            self.menuChanged.emit(action)

    def itemChanged(self, twi, column):
        action = ""
        item = twi.data(0, Qt.UserRole)
        if column == 0:
            item.title = twi.text(0)
            action = "title changed"
        elif column == 1:
            item.url = twi.text(1)
            action = "url changed"
        self.menuChanged.emit(self.getUndoRedoText(item, action))

    def getRow(self, menuitem):
        for i in range(0, self.tree.topLevelItemCount()):
            item = self.tree.topLevelItem(i)
            mi = item.data(0, Qt.UserRole)
            if mi == menuitem:
                return i
        return -1

    def deleteSubItem(self, menuitem):
        row = self.getRow(menuitem.parentItem)
        parent = self.tree.topLevelItem(row)
        if parent:
            for i in range(0, parent.childCount()):
                child = parent.child(i)
                mi = child.data(0, Qt.UserRole)
                if mi == menuitem:
                    parent.removeChild(child)
                    del child
                    break

        if menuitem.parentItem:
            menuitem.parentItem.removeMenuitem(menuitem)

        self.updateButtonStates()
        self.menuChanged.emit(self.getUndoRedoText(menuitem, "deleted"))

    def itemLeft(self, menuitem):
        row = self.getRow(menuitem.parentItem())
        parent = self.tree.topLevelItem(row)
        for i in range(parent.childCount()):
            child = parent.child(i)
            mi = child.data(0, Qt.UserRole)
            if mi == menuitem:
                menuitem.parentItem().removeMenuitem(menuitem)
                menuitem.setSubitem(False)
                self.menu.addMenuitem(menuitem)
                parent.takeChild(i)
                self.addTreeItem(menuitem)
                break

        self.updateButtonStates()
        self.menuChanged.emit(
            self.getUndoRedoText(menuitem, "changed to top item"))

    def iconClicked(self, itemselector, button):
        mi = itemselector.item()
        action = ""
        if button == Qt.LeftButton:
            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().first()
            del dialog
            if not fileName:
                return

            # copy file to assets dir
            info = QFileInfo(fileName)
            name = info.fileName().replace(" ", "_")
            path = self.site.source_path + "/assets/images/" + name
            QFile.copy(fileName, path)

            # also copy file to deploy dir for previews
            dpath = self.site.deploy_path + "/assets/images/" + name
            QFile.copy(fileName, dpath)

            mi.setIcon(path.mid(path.indexOf("assets/images/")))
            itemselector.setImage(QImage(path))
            action = "icon changed"

        elif button == Qt.RightButton:
            action = "icon removed"
            mi.setIcon("")
            itemselector.setImage(QImage(":/images/image_placeholder.png"))

        self.menuChanged.emit(self.getUndoRedoText(mi, action))

    def updateButtonStates(self):
        for i in range(0, self.tree.topLevelItemCount()):
            twi = self.tree.topLevelItem(i)
            tcb = self.tree.itemWidget(twi, 3)
            menuitem = twi.data(0, Qt.UserRole)
            tcb.setEnableDown(i != self.tree.topLevelItemCount() - 1)
            tcb.setEnableUp(i != 0)
            tcb.setEnableRight(i != 0 and len(menuitem.items) == 0)
            tcb.setEnableLeft(False)
            for j in range(0, twi.childCount()):
                stwi = twi.child(j)
                stcb = self.tree.itemWidget(stwi, 3)
                stcb.setEnableLeft(True)
Ejemplo n.º 23
0
    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)
Ejemplo n.º 24
0
    def initGui(self):
        self.dashboard = Expander("Dashboard", ":/images/dashboard_normal.png",
                                  ":/images/dashboard_hover.png",
                                  ":/images/dashboard_selected.png")
        self.content = Expander("Clients", ":/images/clients_normal.png",
                                ":/images/clients_hover.png",
                                ":/images/clients_selected.png")
        self.settings = Expander("Settings", ":/images/settings_normal.png",
                                 ":/images/settings_hover.png",
                                 ":/images/settings_selected.png")

        self.setWindowTitle(QCoreApplication.applicationName() + " " +
                            QCoreApplication.applicationVersion())
        vbox = QVBoxLayout()
        vbox.addWidget(self.dashboard)
        vbox.addWidget(self.content)
        vbox.addWidget(self.settings)
        vbox.addStretch()

        content_box = QVBoxLayout()
        filter_label = QLabel("Filter")
        self.filter = QLineEdit()
        self.filter.textChanged.connect(self.filterChanged)
        self.client_list = QListWidget()
        self.client_list.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)
        self.client_list.currentItemChanged.connect(self.clientChanged)

        button_layout = QHBoxLayout()
        plus_button = FlatButton(":/images/plus.svg")
        self.trash_button = FlatButton(":/images/trash.svg")
        self.trash_button.enabled = False
        button_layout.addWidget(plus_button)
        button_layout.addWidget(self.trash_button)
        content_box.addWidget(filter_label)
        content_box.addWidget(self.filter)
        content_box.addWidget(self.client_list)
        content_box.addLayout(button_layout)
        self.content.addLayout(content_box)

        scroll_content = QWidget()
        scroll_content.setLayout(vbox)
        scroll = QScrollArea()
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setWidget(scroll_content)
        scroll.setWidgetResizable(True)
        scroll.setMaximumWidth(200)
        scroll.setMinimumWidth(200)

        self.navigationdock = QDockWidget("Navigation", self)
        self.navigationdock.setAllowedAreas(Qt.LeftDockWidgetArea
                                            | Qt.RightDockWidgetArea)
        self.navigationdock.setWidget(scroll)
        self.navigationdock.setObjectName("Navigation")

        self.addDockWidget(Qt.LeftDockWidgetArea, self.navigationdock)

        self.showDock = FlatButton(":/images/menu.svg")
        self.showDock.setToolTip("Show Navigation")
        self.statusBar().addPermanentWidget(self.showDock)

        plus_button.clicked.connect(self.addClient)
        self.trash_button.clicked.connect(self.deleteClient)

        self.dashboard.expanded.connect(self.dashboardExpanded)
        self.dashboard.clicked.connect(self.showDashboard)
        self.content.expanded.connect(self.contentExpanded)
        self.content.clicked.connect(self.showClient)

        self.settings.expanded.connect(self.settingsExpanded)
        self.settings.clicked.connect(self.showSettings)

        self.showDock.clicked.connect(self.showMenu)
        self.navigationdock.visibilityChanged.connect(
            self.dockVisibilityChanged)

        self.client = None
        self.client_editor = None
Ejemplo n.º 25
0
class MainWindow(QMainWindow):
    def __init__(self, app):
        QMainWindow.__init__(self)
        self.app = app
        self.clients = None

        self.initGui()
        self.readSettings()
        self.dashboard.setExpanded(True)
        self.showDashboard()
        self.loadDatabase()
        self.loadClients()
        self.statusBar().showMessage("Ready")

    def initGui(self):
        self.dashboard = Expander("Dashboard", ":/images/dashboard_normal.png",
                                  ":/images/dashboard_hover.png",
                                  ":/images/dashboard_selected.png")
        self.content = Expander("Clients", ":/images/clients_normal.png",
                                ":/images/clients_hover.png",
                                ":/images/clients_selected.png")
        self.settings = Expander("Settings", ":/images/settings_normal.png",
                                 ":/images/settings_hover.png",
                                 ":/images/settings_selected.png")

        self.setWindowTitle(QCoreApplication.applicationName() + " " +
                            QCoreApplication.applicationVersion())
        vbox = QVBoxLayout()
        vbox.addWidget(self.dashboard)
        vbox.addWidget(self.content)
        vbox.addWidget(self.settings)
        vbox.addStretch()

        content_box = QVBoxLayout()
        filter_label = QLabel("Filter")
        self.filter = QLineEdit()
        self.filter.textChanged.connect(self.filterChanged)
        self.client_list = QListWidget()
        self.client_list.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Fixed)
        self.client_list.currentItemChanged.connect(self.clientChanged)

        button_layout = QHBoxLayout()
        plus_button = FlatButton(":/images/plus.svg")
        self.trash_button = FlatButton(":/images/trash.svg")
        self.trash_button.enabled = False
        button_layout.addWidget(plus_button)
        button_layout.addWidget(self.trash_button)
        content_box.addWidget(filter_label)
        content_box.addWidget(self.filter)
        content_box.addWidget(self.client_list)
        content_box.addLayout(button_layout)
        self.content.addLayout(content_box)

        scroll_content = QWidget()
        scroll_content.setLayout(vbox)
        scroll = QScrollArea()
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setWidget(scroll_content)
        scroll.setWidgetResizable(True)
        scroll.setMaximumWidth(200)
        scroll.setMinimumWidth(200)

        self.navigationdock = QDockWidget("Navigation", self)
        self.navigationdock.setAllowedAreas(Qt.LeftDockWidgetArea
                                            | Qt.RightDockWidgetArea)
        self.navigationdock.setWidget(scroll)
        self.navigationdock.setObjectName("Navigation")

        self.addDockWidget(Qt.LeftDockWidgetArea, self.navigationdock)

        self.showDock = FlatButton(":/images/menu.svg")
        self.showDock.setToolTip("Show Navigation")
        self.statusBar().addPermanentWidget(self.showDock)

        plus_button.clicked.connect(self.addClient)
        self.trash_button.clicked.connect(self.deleteClient)

        self.dashboard.expanded.connect(self.dashboardExpanded)
        self.dashboard.clicked.connect(self.showDashboard)
        self.content.expanded.connect(self.contentExpanded)
        self.content.clicked.connect(self.showClient)

        self.settings.expanded.connect(self.settingsExpanded)
        self.settings.clicked.connect(self.showSettings)

        self.showDock.clicked.connect(self.showMenu)
        self.navigationdock.visibilityChanged.connect(
            self.dockVisibilityChanged)

        self.client = None
        self.client_editor = None

    def showDashboard(self):
        db = Dashboard()
        db.clients.connect(self.showClient)
        db.settings.connect(self.showSettings)
        self.setCentralWidget(db)

    def showClient(self):
        self.client_editor = ClientEditor(self)
        self.setCentralWidget(self.client_editor)

    def showSettings(self):
        s = SettingsEditor(self)
        self.setCentralWidget(s)

    def closeEvent(self, event):
        self.writeSettings()
        event.accept()

    def writeSettings(self):
        settings = QSettings(QSettings.IniFormat, QSettings.UserScope,
                             QCoreApplication.organizationName(),
                             QCoreApplication.applicationName())
        settings.setValue("geometry", self.saveGeometry())
        settings.setValue("state", self.saveState())
        settings.setValue("database", self.database)
        settings.setValue("fontSize", str(self.fontSize))

    def readSettings(self):
        settings = QSettings(QSettings.IniFormat, QSettings.UserScope,
                             QCoreApplication.organizationName(),
                             QCoreApplication.applicationName())
        geometry = settings.value("geometry", QByteArray())
        if geometry.isEmpty():
            availableGeometry = QApplication.desktop().availableGeometry(self)
            self.resize(availableGeometry.width() / 3,
                        availableGeometry.height() / 2)
            self.move(int(((availableGeometry.width() - self.width()) / 2)),
                      int((availableGeometry.height() - self.height()) / 2))
        else:
            self.restoreGeometry(geometry)
            self.restoreState(settings.value("state"))
        self.database = settings.value("database")
        if not self.database:
            self.database = "."
        fs = settings.value("fontSize")
        if not fs:
            fs = 10
        self.fontSize = int(fs)
        font = QFont("Sans Serif", self.fontSize)
        self.app.setFont(font)

    def dashboardExpanded(self, value):
        if value:
            self.content.setExpanded(False)
            self.settings.setExpanded(False)

    def contentExpanded(self, value):
        if value:
            self.dashboard.setExpanded(False)
            self.settings.setExpanded(False)

    def settingsExpanded(self, value):
        if value:
            self.dashboard.setExpanded(False)
            self.content.setExpanded(False)

    def showMenu(self):
        self.navigationdock.setVisible(True)

    def dockVisibilityChanged(self, visible):
        self.showDock.setVisible(not visible)

    def filterChanged(self):
        self.loadClients()

    def loadClients(self):
        if not self.clients:
            return

        self.client_list.clear()
        filter = self.filter.text()

        a = []
        for c in self.clients:
            if filter.lower() in c["name"].lower():
                a.append(c)

        s = sorted(a, key=namesort)
        for c in s:
            item = QListWidgetItem()
            item.setText(c["name"])
            item.setData(3, c)
            self.client_list.addItem(item)
        self.client_list.setCurrentRow(0)

    def addClient(self):
        now = datetime.now()
        newclient = {
            "number": "",
            "name": "",
            "birthday_year": 1990,
            "birthday_month": 1,
            "birthday_day": 1,
            "profession": "",
            "address": "",
            "mobile": "",
            "email": "",
            "notes": ""
        }
        self.clients.insert(newclient)
        self.showClient()
        self.loadClients()
        q = Query()
        self.client = self.clients.get(q.name == "")
        self.client["name"] = ""
        self.client_editor.reload()

    def deleteClient(self):
        self.clients.remove(doc_ids=[self.client.doc_id])
        self.loadClients()

    def loadDatabase(self):
        try:
            self.db = TinyDB(os.path.join(self.database, "lob.json"))
            self.clients = self.db.table('Clients')
        except:
            print("Unable to openthe database")

    def updateClient(self):
        for i in range(self.client_list.count()):
            item = self.client_list.item(i)
            c = item.data(3)
            if c.doc_id == self.client.doc_id:
                item.setData(3, self.client)
                item.setText(self.client["name"])
                break

    def clientChanged(self, item):
        if item:
            self.client = item.data(3)
            if self.client_editor:
                self.client_editor.reload()
            self.trash_button.enabled = True
        else:
            self.client = None
            self.client_editor.reload()
            self.trash_button.enabled = False
Ejemplo n.º 26
0
class MenuEditorTableCellButtons(QWidget):
    deleteItem = pyqtSignal(object)
    editItem = pyqtSignal(object)
    itemLeft = pyqtSignal(object)
    itemRight = pyqtSignal(object)
    itemUp = pyqtSignal(object)
    itemDown = pyqtSignal(object)

    def __init__(self):
        QWidget.__init__(self)
        self.delete = FlatButton(":/images/trash_normal.png",
                                 ":/images/trash_hover.png")
        self.edit = FlatButton(":/images/edit_normal.png",
                               ":/images/edit_hover.png")
        self.left = FlatButton(":/images/left_normal.png",
                               ":/images/left_hover.png", "",
                               ":/images/left_disabled.png")
        self.right = FlatButton(":/images/right_normal.png",
                                ":/images/right_hover.png", "",
                                ":/images/right_disabled.png")
        self.up = FlatButton(":/images/up_normal.png", ":/images/up_hover.png",
                             "", ":/images/up_disabled.png")
        self.down = FlatButton(":/images/down_normal.png",
                               ":/images/down_hover.png", "",
                               ":/images/down_disabled.png")
        self.edit.setToolTip("Edit Item")
        self.delete.setToolTip("Delete Item")
        self.left.setToolTip("Make Mainitem")
        self.right.setToolTip("Make Subitem")
        self.up.setToolTip("Sort Up")
        self.down.setToolTip("Sort Down")
        self.left.setEnabled(False)
        self.right.setEnabled(False)
        self.up.setEnabled(False)
        self.down.setEnabled(False)
        self.item = None

        hbox = QHBoxLayout()
        hbox.addWidget(self.edit)
        hbox.addWidget(self.up)
        hbox.addWidget(self.down)
        hbox.addWidget(self.left)
        hbox.addWidget(self.right)
        hbox.addWidget(self.delete)
        self.setLayout(hbox)

        self.delete.clicked.connect(self.deleteItemClicked)
        self.edit.clicked.connect(self.editItemClicked)
        self.left.clicked.connect(self.itemLeftClicked)
        self.right.clicked.connect(self.itemRightClicked)
        self.up.clicked.connect(self.itemUpClicked)
        self.down.clicked.connect(self.itemDownClicked)

    def setMenuItem(self, m):
        self.item = m

    def deleteItemClicked(self):
        self.deleteItem.emit(self.item)

    def editItemClicked(self):
        self.editItem.emit(self.item)

    def itemLeftClicked(self):
        self.itemLeft.emit(self.item)

    def itemRightClicked(self):
        self.itemRight.emit(self.item)

    def itemUpClicked(self):
        self.itemUp.emit(self.item)

    def itemDownClicked(self):
        self.itemDown.emit(self.item)

    def setEnableLeft(self, mode):
        self.left.setEnabled(mode)

    def setEnableRight(self, mode):
        self.right.setEnabled(mode)

    def setEnableUp(self, mode):
        self.up.setEnabled(mode)

    def setEnableDown(self, mode):
        self.down.setEnabled(mode)
    def __init__(self):
        QDialog.__init__(self)
        self.result = 0
        self.setWindowTitle(QCoreApplication.translate("ColumnsDialog", "Insert Columns"))
        grid = QGridLayout()
        b1 = FlatButton(":/images/columns1.png", ":/images/columns1_hover.png")
        b2 = FlatButton(":/images/columns2.png", ":/images/columns2_hover.png")
        b3 = FlatButton(":/images/columns3.png", ":/images/columns3_hover.png")
        b4 = FlatButton(":/images/columns4.png", ":/images/columns4_hover.png")
        b5 = FlatButton(":/images/columns5.png", ":/images/columns5_hover.png")
        b6 = FlatButton(":/images/columns6.png", ":/images/columns6_hover.png")
        b7 = FlatButton(":/images/columns7.png", ":/images/columns7_hover.png")
        b8 = FlatButton(":/images/columns8.png", ":/images/columns8_hover.png")
        b9 = FlatButton(":/images/columns9.png", ":/images/columns9_hover.png")
        b10 = FlatButton(":/images/columns10.png", ":/images/columns10_hover.png")
        b11 = FlatButton(":/images/columns11.png", ":/images/columns11_hover.png")
        grid.addWidget(b1, 0, 0)
        grid.addWidget(b2, 0, 1)
        grid.addWidget(b3, 0, 2)
        grid.addWidget(b4, 1, 0)
        grid.addWidget(b5, 1, 1)
        grid.addWidget(b6, 1, 2)
        grid.addWidget(b7, 3, 0)
        grid.addWidget(b8, 3, 1)
        grid.addWidget(b9, 3, 2)
        grid.addWidget(b10, 4, 0)
        grid.addWidget(b11, 4, 1)

        closeButton = QPushButton(QCoreApplication.translate("general", "Close"))

        buttonsLayout = QHBoxLayout()
        buttonsLayout.addStretch(1)
        buttonsLayout.addWidget(closeButton)

        mainLayout = QVBoxLayout()
        mainLayout.addLayout(grid)
        mainLayout.addStretch(1)
        mainLayout.addSpacing(12)
        mainLayout.addLayout(buttonsLayout)
        self.setLayout(mainLayout)

        closeButton.clicked.connect(self.close)
        b1.clicked.connect(self.close1)
        b2.clicked.connect(self.close2)
        b3.clicked.connect(self.close3)
        b4.clicked.connect(self.close4)
        b5.clicked.connect(self.close5)
        b6.clicked.connect(self.close6)
        b7.clicked.connect(self.close7)
        b8.clicked.connect(self.close8)
        b9.clicked.connect(self.close9)
        b10.clicked.connect(self.close10)
        b11.clicked.connect(self.close11)
Ejemplo n.º 28
0
    def __init__(self):
        QWidget.__init__(self)
        self.delete = FlatButton(":/images/trash_normal.png",
                                 ":/images/trash_hover.png")
        self.edit = FlatButton(":/images/edit_normal.png",
                               ":/images/edit_hover.png")
        self.left = FlatButton(":/images/left_normal.png",
                               ":/images/left_hover.png", "",
                               ":/images/left_disabled.png")
        self.right = FlatButton(":/images/right_normal.png",
                                ":/images/right_hover.png", "",
                                ":/images/right_disabled.png")
        self.up = FlatButton(":/images/up_normal.png", ":/images/up_hover.png",
                             "", ":/images/up_disabled.png")
        self.down = FlatButton(":/images/down_normal.png",
                               ":/images/down_hover.png", "",
                               ":/images/down_disabled.png")
        self.edit.setToolTip("Edit Item")
        self.delete.setToolTip("Delete Item")
        self.left.setToolTip("Make Mainitem")
        self.right.setToolTip("Make Subitem")
        self.up.setToolTip("Sort Up")
        self.down.setToolTip("Sort Down")
        self.left.setEnabled(False)
        self.right.setEnabled(False)
        self.up.setEnabled(False)
        self.down.setEnabled(False)
        self.item = None

        hbox = QHBoxLayout()
        hbox.addWidget(self.edit)
        hbox.addWidget(self.up)
        hbox.addWidget(self.down)
        hbox.addWidget(self.left)
        hbox.addWidget(self.right)
        hbox.addWidget(self.delete)
        self.setLayout(hbox)

        self.delete.clicked.connect(self.deleteItemClicked)
        self.edit.clicked.connect(self.editItemClicked)
        self.left.clicked.connect(self.itemLeftClicked)
        self.right.clicked.connect(self.itemRightClicked)
        self.up.clicked.connect(self.itemUpClicked)
        self.down.clicked.connect(self.itemDownClicked)
Ejemplo n.º 29
0
    def __init__(self, site, type):
        QWidget.__init__(self)
        self.site = site
        self.addedContentName = ""
        self.type = type
        self.undoStack = QUndoStack()
        vbox = QVBoxLayout()
        layout = QGridLayout()
        titleLabel = QLabel()
        button = QPushButton()
        if self.type == ContentType.PAGE:
            button.setText("Add Page")
        else:
            button.setText("Add Post")
        button.setMaximumWidth(120)
        if self.type == ContentType.PAGE:
            titleLabel.setText("Pages")
        else:
            titleLabel.setText("Posts")
        fnt = titleLabel.font()
        fnt.setPointSize(20)
        fnt.setBold(True)
        titleLabel.setFont(fnt)

        self.undo = FlatButton(":/images/undo_normal.png",
                               ":/images/undo_hover.png", "",
                               ":/images/undo_disabled.png")
        self.redo = FlatButton(":/images/redo_normal.png",
                               ":/images/redo_hover.png", "",
                               ":/images/redo_disabled.png")
        self.undo.setToolTip("Undo")
        self.redo.setToolTip("Redo")
        self.undo.setEnabled(False)
        self.redo.setEnabled(False)
        hbox = QHBoxLayout()
        hbox.addStretch(0)
        hbox.addWidget(self.undo)
        hbox.addWidget(self.redo)

        self.list = QTableWidget(0, 6, self)
        self.list.verticalHeader().hide()
        self.list.setSelectionMode(QAbstractItemView.SingleSelection)
        self.list.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.list.horizontalHeader().setSectionResizeMode(
            1, QHeaderView.Stretch)
        self.list.setToolTip("Double click to edit item")
        labels = ["", "Name", "Source", "Layout", "Author", "Date"]
        self.list.setHorizontalHeaderLabels(labels)

        self.reload()

        layout.addWidget(titleLabel, 0, 0)
        layout.addLayout(hbox, 0, 2)
        layout.addWidget(button, 1, 0)
        layout.addWidget(self.list, 2, 0, 1, 3)
        vbox.addLayout(layout)
        self.setLayout(vbox)

        button.clicked.connect(self.addPage)
        self.list.cellDoubleClicked.connect(self.tableDoubleClicked)
        self.redo.clicked.connect(self.doredo)
        self.undo.clicked.connect(self.doundo)
        self.undoStack.canUndoChanged.connect(self.canUndoChanged)
        self.undoStack.canRedoChanged.connect(self.canRedoChanged)
        self.undoStack.redoTextChanged.connect(self.redoTextChanged)
Ejemplo n.º 30
0
    def initGui(self):
        self.installEventFilter(self)
        self.dashboard = Expander(
            QCoreApplication.translate("MainWindow", "Dashboard"),
            ":/images/dashboard_normal.png", ":/images/dashboard_hover.png",
            ":/images/dashboard_selected.png")
        self.content = Expander(
            QCoreApplication.translate("MainWindow",
                                       "Content"), ":/images/pages_normal.png",
            ":/images/pages_hover.png", ":/images/pages_selected.png")
        self.appearance = Expander(
            QCoreApplication.translate("MainWindow", "Appearance"),
            ":/images/appearance_normal.png", ":/images/appearance_hover.png",
            ":/images/appearance_selected.png")
        self.settings = Expander(
            QCoreApplication.translate("MainWindow", "Settings"),
            ":/images/settings_normal.png", ":/images/settings_hover.png",
            ":/images/settings_selected.png")

        self.setWindowTitle(QCoreApplication.applicationName() + " " +
                            QCoreApplication.applicationVersion())
        vbox = QVBoxLayout()
        vbox.addWidget(self.dashboard)
        vbox.addWidget(self.content)
        vbox.addWidget(self.appearance)
        vbox.addWidget(self.settings)
        vbox.addStretch()

        content_box = QVBoxLayout()
        pages_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Pages"))
        posts_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Posts"))
        content_box.addWidget(pages_button)
        content_box.addWidget(posts_button)
        self.content.addLayout(content_box)

        app_box = QVBoxLayout()
        themes_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Themes"))
        menus_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Menus"))
        self.theme_settings_button = HyperLink(
            QCoreApplication.translate("MainWindow", "Theme Settings"))
        self.theme_settings_button.setVisible(False)
        app_box.addWidget(menus_button)
        app_box.addWidget(themes_button)
        app_box.addWidget(self.theme_settings_button)

        self.appearance.addLayout(app_box)

        scroll_content = QWidget()
        scroll_content.setLayout(vbox)
        scroll = QScrollArea()
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setWidget(scroll_content)
        scroll.setWidgetResizable(True)
        scroll.setMaximumWidth(200)
        scroll.setMinimumWidth(200)

        self.navigationdock = QDockWidget(
            QCoreApplication.translate("MainWindow", "Navigation"), self)
        self.navigationdock.setAllowedAreas(Qt.LeftDockWidgetArea
                                            | Qt.RightDockWidgetArea)
        self.navigationdock.setWidget(scroll)
        self.navigationdock.setObjectName("Navigation")

        self.addDockWidget(Qt.LeftDockWidgetArea, self.navigationdock)

        self.showDock = FlatButton(":/images/edit_normal.png",
                                   ":/images/edit_hover.png")
        self.showDock.setToolTip(
            QCoreApplication.translate("MainWindow", "Show Navigation"))
        self.statusBar().addPermanentWidget(self.showDock)

        self.dashboard.expanded.connect(self.dashboardExpanded)
        self.dashboard.clicked.connect(self.showDashboard)
        self.content.expanded.connect(self.contentExpanded)
        self.content.clicked.connect(self.showPages)
        self.appearance.expanded.connect(self.appearanceExpanded)
        self.appearance.clicked.connect(self.showMenus)
        self.settings.expanded.connect(self.settingsExpanded)
        self.settings.clicked.connect(self.showSettings)
        menus_button.clicked.connect(self.showMenus)
        pages_button.clicked.connect(self.showPages)
        posts_button.clicked.connect(self.showPosts)
        themes_button.clicked.connect(self.showThemes)
        self.theme_settings_button.clicked.connect(self.showThemesSettings)
        self.showDock.clicked.connect(self.showMenu)
        self.navigationdock.visibilityChanged.connect(
            self.dockVisibilityChanged)