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 __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()
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()
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()