Ejemplo n.º 1
0
    def __init__(self, parent=None):
        super(SafWindow, self).__init__(parent)
        self.setAcceptDrops(True)
        self.safelist = ['.saf']
        
        self.current_file = ""
        self.text_edited = False
        self.level = 0

        self.save_timer = SaveCloser()

        self.offset_editor = OffsetEditor()
        self.offset_editor.setWindowTitle('Safety Play - SAF Offset Editor')

        self.setupUi()
        self.setupActions()
Ejemplo n.º 2
0
    def __init__(self, parent=None):
        super(SrtList, self).__init__(parent)
        self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.setAcceptDrops(True)
        self.safelist = ['.srt',
                         '.lrc',
                         '.txt']
        self.segments = []
        self.srt = ''
        self.segment_editor = SegmentEditor()
        self.offset_editor = OffsetEditor()
        self.offset_editor.setWindowTitle('Safety Play - SRT Offset Editor')

        self.save_closer = SaveCloser()
        self.save_closer.start()

        self.save_message = Saved(self)
        self.save_message.hide()

        self.reds, self.oranges, self.yellows, self.greens = self.get_vulgars()

        self.setupActions()
Ejemplo n.º 3
0
class SrtList(QtGui.QListWidget):
    time_clicked = QtCore.Signal(str)
    deleted = QtCore.Signal(int)

    start_time_request = QtCore.Signal(int)
    end_time_request = QtCore.Signal(int)
    edit_segment_request = QtCore.Signal(Segment)
    inserted = QtCore.Signal(Segment, int)

    edited = QtCore.Signal()
    save_completed = QtCore.Signal()
    
    def __init__(self, parent=None):
        super(SrtList, self).__init__(parent)
        self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
        self.setAcceptDrops(True)
        self.safelist = ['.srt',
                         '.lrc',
                         '.txt']
        self.segments = []
        self.srt = ''
        self.segment_editor = SegmentEditor()
        self.offset_editor = OffsetEditor()
        self.offset_editor.setWindowTitle('Safety Play - SRT Offset Editor')

        self.save_closer = SaveCloser()
        self.save_closer.start()

        self.save_message = Saved(self)
        self.save_message.hide()

        self.reds, self.oranges, self.yellows, self.greens = self.get_vulgars()

        self.setupActions()

    def setupActions(self):
        self.itemDoubleClicked.connect(self.goto)
        self.save_closer.time_up.connect(self.hide_save)
        self.segment_editor.ok_signal.connect(self.edit_segment)
        self.segment_editor.cancel.clicked.connect(self.set_enabled)
        self.offset_editor.ok_signal.connect(self.change_time)

    def get_vulgars(self):
        file = open(path() + '/' + 'vulgar.txt', 'r')
        lines = file.readlines()
        file.close()
        redgroup = []
        orangegroup = []
        yellowgroup = []
        greengroup = []
        doing_red = False
        doing_orange = False
        doing_yellow = False
        doing_green = False
        for i in range(len(lines)):
            if lines[i].rstrip() == '#--RED--#':
                doing_red = True
                doing_orange = False
                doing_yellow = False
                doing_green = False
            elif lines[i].rstrip() == "#--ORANGE--#":
                doing_red = False
                doing_orange = True
                doing_yellow = False
                doing_green = False
            elif lines[i].rstrip() == "#--YELLOW--#":
                doing_red = False
                doing_orange = False
                doing_yellow = True
                doing_green = False
            elif lines[i].rstrip() == "#--GREEN--#":
                doing_red = False
                doing_orange = False
                doing_yellow = False
                doing_green = True

            if (not lines[i].startswith('#')
                and not lines[i] == '\n'
                and not lines[i] == ''):
                if doing_red:
                    redgroup.append(lines[i].rstrip())
                elif doing_orange:
                    orangegroup.append(lines[i].rstrip())
                elif doing_yellow:
                    yellowgroup.append(lines[i].rstrip())
                elif doing_green:
                    greengroup.append(lines[i].rstrip())
        return redgroup, orangegroup, yellowgroup, greengroup
        
    def goto(self, item):
        removed_spaces = item.text().split(' ')[0]
        removed_start_bracket = removed_spaces.replace('[','')
        removed_end_bracket = removed_start_bracket.replace(']','')
        self.time_clicked.emit(removed_end_bracket)

    def add_srt(self, srt):
        self.clear()
        if srt.endswith('.srt'):
            self.srt = srt
            self.segments = parse_srt(srt)
            self.add_segments(self.segments)

        elif srt.endswith('.lrc'):
            self.edited.emit()
            self.srt = srt[:len(srt) - 4] + '.srt'
            self.segments = parse_lrc(srt)
            split_lines(self.segments)
            self.add_segments(self.segments)

        elif srt.endswith('.txt'):
            self.edited.emit()
            srt[:len(srt) - 4] + '.srt'
            self.segments = parse_txt(srt)
            split_lines(self.segments)
            self.add_segments(self.segments)

    def set_enabled(self):
        self.setEnabled(True)
        
    def add_segments(self, segments):
        for i in range(len(segments)):
            start = '[' + sec_to_hms(segments[i].start_time) + '] '
            end = ' [' + sec_to_hms(segments[i].end_time) + ']'
            if not segments[i].topline == '':
                words = segments[i].topline + ' ' + segments[i].bottomline
            else:
                words = segments[i].bottomline

            new_item = QtGui.QListWidgetItem()
            new_item.setText(start + words + end)
            r = self.reds
            o = self.oranges
            y = self.yellows
            g = self.greens
            new_item.setBackground(QtGui.QColor(check_vulgar(r, o, y, g, words)))
            self.addItem(new_item)
        self.setCurrentItem(self.item(0))

    def change_time(self, time):
        max_time = convert_to_seconds('23:59:59,999')
        if not self.segments == []:
            self.clear()
            for i in range(len(self.segments)):
                if not self.segments[i].start_time + time < 0:
                    if self.segments[i].start_time + time > max_time:
                        self.segments[i].start_time = max_time
                    else:
                        new_start = self.segments[i].start_time + time
                        self.segments[i].start_time = new_start
                else:
                    self.segments[i].start_time = 0
                if not self.segments[i].end_time + time < 0:
                    if self.segments[i].end_time + time > max_time:
                        self.segments[i].end_time = max_time
                    else:
                        new_end = self.segments[i].end_time + time
                        self.segments[i].end_time = new_end
                else:
                    self.segments[i].end_time = 0

            self.add_segments(self.segments)
            self.edited.emit()

    def save_to_file(self):
        if self.srt != '':
            write_srt(self.segments, self.srt)
            self.save_completed.emit()
            self.show_save_message()
        else:
            self.browse_to_srt()

    def browse_to_srt(self):
        userhome = os.path.expanduser('~')
        file, _ = QtGui.QFileDialog.getSaveFileName(
            self, 'Save SRT File', userhome, "*.srt")
        if not file == '':
            self.srt = file
            self.save_to_file()

    def show_save_message(self):
        self.save_message.resize(self.width(), self.height())
        self.save_message.show()
        self.save_closer.start()

    def hide_save(self):
        self.save_message.hide()

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            path = str(event.mimeData().urls()[0].toLocalFile())
            ending = path[len(path)-4::]
            if ending in self.safelist:
                event.accept()
            else:
                event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls:
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls:
            self.add_srt(str(event.mimeData().urls()[0].toLocalFile()))
        else:
            event.ignore()

    def redo_segment_numbers(self):
        for i in range(len(self.segments)):
            self.segments[i].segment_number = i + 1

    def insert_item(self, bottom):
        #bottom = 1, top = 0       
        item = QtGui.QListWidgetItem()
        item.setText('[00:00:00,000][00:00:00,000]')
        seg = Segment()
        
        seg.topline = ''
        seg.bottomline = ''
        seg.start_time = 0
        seg.end_time = 0
        
        if len(self.selectedItems()) > 0:
            index = self.row(self.selectedItems()[0])
            self.insertItem(index + bottom, item)
            seg.segment_number = index + bottom + 1
            self.segments.insert(index + bottom, seg)
            self.inserted.emit(seg, index + bottom)
            self.clearSelection()
            self.setCurrentItem(self.item(index + bottom))
        else:
            self.addItem(item)
            seg.segment_number = 1
            self.segments.append(seg)
            self.setCurrentItem(self.item(0))
            self.inserted.emit(seg, 0)
            self.clearSelection()
            self.setCurrentItem(self.item(0))

        self.redo_segment_numbers()
        self.edited.emit()

    def edit_segment(self, segment):
        self.edit_segment_request.emit(segment)

    def open_edit_window(self):
        if len(self.selectedItems()) > 0:
            item = self.selectedItems()[0]
            index = self.row(item)
            self.segment_editor.set_segment(self.segments[index])
            self.segment_editor.show()
            self.segment_editor.topline_text.setFocus()
            self.setEnabled(False)

    def delete_selected(self):
        for i in self.selectedItems():
            self.deleted.emit(self.row(i))
            self.segments.pop(self.row(i))
            self.takeItem(self.row(i))
        self.redo_segment_numbers()
        self.edited.emit()

    def go_down(self):
        if self.count() > 0:
            r = self.row(self.currentItem())
            if r < self.count() - 1:
                self.setCurrentItem(self.item(r + 1))

    def go_up(self):
        if self.count() > 0:
            r = self.row(self.currentItem())
            if r > 0:
                self.setCurrentItem(self.item(r - 1))

    def dispense(self):
        if self.count() > 0:
            r = self.row(self.currentItem())
            self.start_time_request.emit(r)

    def finito(self):
        if self.count() > 0:
            r = self.row(self.currentItem())
            self.end_time_request.emit(r)

    def keyPressEvent(self, event):
        key = event.key()
        delete = QtCore.Qt.Key_Delete
        #Deleting an item
        if key == delete and len(self.selectedItems()) > 0:
            self.delete_selected()
Ejemplo n.º 4
0
class SafWindow(QtGui.QWidget):
    record_request = QtCore.Signal()
    saf_exit = QtCore.Signal()
    saved = QtCore.Signal(str)
    show_vid = QtCore.Signal()
    show_saf = QtCore.Signal()
    show_srt = QtCore.Signal()
    reset_view = QtCore.Signal()
    
    def __init__(self, parent=None):
        super(SafWindow, self).__init__(parent)
        self.setAcceptDrops(True)
        self.safelist = ['.saf']
        
        self.current_file = ""
        self.text_edited = False
        self.level = 0

        self.save_timer = SaveCloser()

        self.offset_editor = OffsetEditor()
        self.offset_editor.setWindowTitle('Safety Play - SAF Offset Editor')

        self.setupUi()
        self.setupActions()

    def reset_level(self):
        self.plainTextEdit.verticalScrollBar().setValue(self.level)
    
    def change_time(self, time):
        go = self.check_errors()
        if go:
            self.level = self.plainTextEdit.verticalScrollBar().value()
            lines = self.plainTextEdit.toPlainText().split('\n')
            newlines = []
            for i in range(len(lines)):
                if not lines[i] == '' and not lines[i].startswith('#'):
                    words = lines[i].replace('[', '').split(']')

                    if words[0] == '00:00:00,000' and time < 0:
                        t = words[0]

                    elif (convert_to_seconds(words[0]) + time >
                          convert_to_seconds('23:59:59,999')):
                        t = '23:59:59,999'
                        
                    else:
                        t = convert_to_seconds(words[0]) + time
                        t = sec_to_hms(t)
                        if '-' in t:
                            t = '00:00:00,000'

                    if words[1] == '00:00:00,000' and time < 0:
                        t2 = words[1]

                    elif (convert_to_seconds(words[1]) + time >
                          convert_to_seconds('23:59:59,999')):
                        t2 = '23:59:59,999'
                    
                    else:
                        t2 = convert_to_seconds(words[1]) + time
                        t2 = sec_to_hms(t2)
                        if '-' in t2:
                            t2 = '00:00:00,000'
                    

                    l = '[' + str(t) + '][' + str(t2) + ']' + words[2]
                    newlines.append(l)
                else:
                    newlines.append(lines[i])
            string = ""
            for i in range(len(newlines)):
                if not i == len(newlines) - 1:
                    string = string + newlines[i] + '\n'
                else:
                    string = string + newlines[i]
            self.plainTextEdit.clear()
            self.plainTextEdit.appendPlainText(string)
            self.reset_level()

    def text_was_changed(self):
        self.text_edited = True
        self.setWindowTitle('Safety Play - SAF (edited)')

    def record(self):
        self.record_request.emit()

    def write_record(self, line):
        self.plainTextEdit.appendPlainText(line)

    def write_mute(self):
        self.plainTextEdit.insertPlainText('mute')

    def write_skip(self):
        self.plainTextEdit.insertPlainText('skip')

    def write_black(self):
        self.plainTextEdit.insertPlainText('black')

    def check_errors(self):
        self.whiten()
        lines = self.plainTextEdit.toPlainText().split('\n')
        for i in range(len(lines)):
            result = check_line(lines[i].rstrip())
            if result == False:
                self.highlight(self.get_index(lines, i), i)
                return False
        return True

    def save_sequence(self):
        go = self.check_errors()
        if go:
            self.save_to_file()
    
    def save_to_file(self):
        try:
            file = open(self.current_file, 'w')
            text = self.plainTextEdit.toPlainText()
            file.write(text)
            file.close()
            self.show_save_message()
            self.setWindowTitle('Safety Play - SAF')
            self.colorize()
        except FileNotFoundError:
            self.browse_to_saf()

    def browse_to_saf(self):
        userhome = os.path.expanduser('~')
        file, _ = QtGui.QFileDialog.getSaveFileName(
            self, 'Save SAF File', userhome, "*.saf")
        if not file == '':
            self.current_file = file
            self.save_to_file()

    def get_index(self, lines, line_number):
        total = 0
        for i in range(0, line_number):
            total = total + len(lines[i]) + 1
        return total      

    def show_save_message(self):
        self.save_message.resize(self.width(), self.height())
        self.save_message.show()
        self.save_closer.start()
        self.text_edited = False

    def hide_save(self):
        self.save_message.hide()
        self.text_edited = False
        self.saved.emit(self.current_file)

    def highlight(self, index, line):
        cursor = self.plainTextEdit.textCursor()
        form = QtGui.QTextCharFormat()
        form.setBackground(QtGui.QBrush(QtGui.QColor("pink")))
        cursor.setPosition(index)
        cursor.movePosition(QtGui.QTextCursor.EndOfLine, QtGui.QTextCursor.KeepAnchor, 1)
        cursor.mergeCharFormat(form)
        cursor.movePosition(QtGui.QTextCursor.EndOfLine, QtGui.QTextCursor.MoveAnchor, 1)
        self.plainTextEdit.verticalScrollBar().setValue(line)

    def whiten(self):
        lines = self.plainTextEdit.toPlainText().split('\n')
        index = 0
        cursor = self.plainTextEdit.textCursor()
        form = QtGui.QTextCharFormat()
        form.setBackground(QtGui.QBrush(QtGui.QColor("white")))
        for i in range(len(lines)):
            cursor.setPosition(index)
            cursor.movePosition(QtGui.QTextCursor.EndOfBlock, QtGui.QTextCursor.KeepAnchor, 1)
            cursor.mergeCharFormat(form)
            index = index + len(lines[i]) + 1

    def colorize(self):
        lines = self.plainTextEdit.toPlainText().split('\n')
        index = 0
        cursor = self.plainTextEdit.textCursor()
        form = QtGui.QTextCharFormat()
        for i in range(len(lines)):
            if lines[i].startswith('#'):
                form.setForeground(QtGui.QBrush(QtGui.QColor("green")))
                cursor.setPosition(index)
                cursor.movePosition(QtGui.QTextCursor.EndOfBlock, QtGui.QTextCursor.KeepAnchor, 1)
                cursor.mergeCharFormat(form)
                index = index + len(lines[i]) + 1
            elif lines[i].rstrip() == '':
                index = index + len(lines[i]) + 1
            else:
                form.setForeground(QtGui.QBrush(QtGui.QColor("blue")))
                cursor.setPosition(index)
                for x in range(0, 14):
                    cursor.movePosition(QtGui.QTextCursor.Right, QtGui.QTextCursor.KeepAnchor, 1)
                    cursor.mergeCharFormat(form)
                index = index + 14
                form.setForeground(QtGui.QBrush(QtGui.QColor("purple")))
                cursor.setPosition(index)
                for x in range(0, 14):    
                    cursor.movePosition(QtGui.QTextCursor.Right, QtGui.QTextCursor.KeepAnchor, 1)
                    cursor.mergeCharFormat(form)
                index = index + 14
                form.setForeground(QtGui.QBrush(QtGui.QColor("black")))
                cursor.setPosition(index)
                cursor.movePosition(QtGui.QTextCursor.EndOfBlock, QtGui.QTextCursor.KeepAnchor, 1)
                cursor.mergeCharFormat(form)
                index = index + len(lines[i]) - 27

    def insert_fancy_title(self, title):
        if len(title) > 0 and len(title) < 36:
            self.plainTextEdit.insertPlainText(fancy_title(title, 40))
        elif len(title) > 35:
            l = len(title) + 4
            self.plainTextEdit.insertPlainText(fancy_title(title, l))

    def shift_text_right(self):
        lines = self.plainTextEdit.toPlainText().split('\n')
        for i in range(len(lines)):
            if not i == len(lines) - 1:
                lines[i] = '\t' + lines[i] + '\n'
            else:
                lines[i] = '\t' + lines[i]
        self.plainTextEdit.clear()
        text = ''.join(lines)
        self.plainTextEdit.appendPlainText(text)
        self.reset_level()

    def shift_text_left(self):
        lines = self.plainTextEdit.toPlainText().split('\n')
        for i in range(len(lines)):
            if not i == len(lines) - 1:
                if lines[i].startswith('\t'):
                    lines[i] = lines[i][1::] + '\n'
                else:
                    lines[i] = lines[i] + '\n'
            else:
                if lines[i].startswith('\t'):
                    lines[i] = lines[i][1::]
        self.plainTextEdit.clear()
        text = ''.join(lines)
        self.plainTextEdit.appendPlainText(text)
        self.reset_level()

    def add_file(self, file):
        self.current_file = file
        self.level = self.plainTextEdit.verticalScrollBar().value()
        self.plainTextEdit.clear()
        try:
            f = open(file, 'r')
            lines = f.readlines()
            f.close()
            string = ""
            for i in range(len(lines)):
                string = string + lines[i]
            self.plainTextEdit.appendPlainText(string)
            self.text_edited = False
        except FileNotFoundError:
            pass
        self.reset_level()
        self.colorize()
        self.check_errors()
        self.setWindowTitle('Safety Play - SAF')

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            try:
                path = str(event.mimeData().urls()[0].toLocalFile())
                ending = path[len(path)-4::]
                if ending in self.safelist:
                    event.accept()
                else:
                    event.ignore()
            except IndexError:
                pass
            
    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls:
            event.setDropAction(QtCore.Qt.CopyAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls:
            self.add_file(str(event.mimeData().urls()[0].toLocalFile()))
        else:
            event.ignore()

    def moveEvent(self, event):
        self.save_timer.start()

    def resizeEvent(self, event):
        self.save_timer.start()

    def save_pos_and_size(self):
        pos = [self.x(), self.y()]
        size = [self.width(), self.height()]
        save(saf_pos = pos, saf_size = size)

    def closeEvent(self, event):
        self.saf_exit.emit()
        self.offset_editor.close()
        self.save_timer.terminate()

    def setupActions(self):
        self.record_button.clicked.connect(self.record)
        self.mute_button.clicked.connect(self.write_mute)
        self.skip_button.clicked.connect(self.write_skip)
        self.black_button.clicked.connect(self.write_black)
        self.save_closer.time_up.connect(self.hide_save)
        self.plainTextEdit.textChanged.connect(self.text_was_changed)
        self.save_timer.time_up.connect(self.save_pos_and_size)

        self.offset_editor.ok_signal.connect(self.change_time)

        self.shcut_safAs = QtGui.QShortcut(self)
        self.shcut_safAs.setKey('Ctrl+Shift+S')
        self.connect(self.shcut_safAs,
                     QtCore.SIGNAL("activated()"),
                     self.browse_to_saf)

    def setupUi(self):
        self.setWindowTitle('Safety Play - SAF')
        self.setWindowIcon(SafetyPlayIcon())
        self.settings = load()
        self.resize(self.settings['saf_size'][0],
                    self.settings['saf_size'][1])
        self.move(self.settings['saf_pos'][0],
                             self.settings['saf_pos'][1])
        
        self.vl = QtGui.QVBoxLayout(self)
        self.plainTextEdit = QtGui.QPlainTextEdit()
        self.plainTextEdit.setStyleSheet("font: 10pt 'Consolas'")
        self.plainTextEdit.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap)
        self.vl.addWidget(self.plainTextEdit)

        self.hl = QtGui.QHBoxLayout()

        self.record_button = QtGui.QPushButton()
        self.record_button.setText('Record Time')
        self.hl.addWidget(self.record_button)

        self.mute_button = QtGui.QPushButton()
        self.mute_button.setText('Mute')
        self.hl.addWidget(self.mute_button)

        self.skip_button = QtGui.QPushButton()
        self.skip_button.setText('Skip')
        self.hl.addWidget(self.skip_button)

        self.black_button = QtGui.QPushButton()
        self.black_button.setText('Black')
        self.hl.addWidget(self.black_button)

        self.vl.addLayout(self.hl)

        self.save_closer = SaveCloser()
        
        self.save_message = Saved(self)
        self.save_message.hide()