diff --git a/texter/main.py b/texter/main.py new file mode 100644 index 0000000..5dc8fec --- /dev/null +++ b/texter/main.py @@ -0,0 +1,189 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +import PyQt4.uic +from PyQt4 import QtCore, QtGui +from PyKDE4.kdeui import KActionCollection, KRichTextWidget + +MainWindowForm, MainWindowBase = PyQt4.uic.loadUiType('texter.ui') + +from operator import itemgetter +import cPickle + +class MainWindow(MainWindowBase, MainWindowForm): + def __init__(self, parent = None): + super(MainWindow, self).__init__(parent) + + + # setup the ui + self.setupUi(self) + self.show_private_text.setRichTextSupport(KRichTextWidget.RichTextSupport(0xffffffff)) + self.edit_private_text.setRichTextSupport(KRichTextWidget.RichTextSupport(0xffffffff)) + self.edit_action_collection = KActionCollection(self) + self.edit_private_text.createActions(self.edit_action_collection) + for action in self.edit_action_collection.actions(): + self.toolBar.addAction(action) + + + print dir(self) + + + self.tabWidget.currentChanged.connect(self.slot_toggleToolbox) + self.add_button.clicked.connect(self.slot_addText) + self.save_button.clicked.connect(self.slot_save) + self.publish_button.clicked.connect(self.slot_publish) + self.clear_button.clicked.connect(self.slot_clear) + self.remove_item_button.clicked.connect(self.slot_removeItem) + self.edit_item_selection.activated.connect(self.slot_editLoadItem) + self.item_list.currentRowChanged.connect(self.slot_showLoadItem) + + self.items = dict() + self.slot_load() + self.next_button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Space)) + self.next_button.clicked.connect(self.slot_next_item) + + self.previous_button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Backspace)) + self.previous_button.clicked.connect(self.slot_previous_item) + + def slot_next_item(self): + print "slot_next_item" + index = (self.item_list.currentRow() + 1) % self.item_list.count() + self.item_list.setCurrentRow(index) + self.edit_item_selection.setCurrentIndex(index) + self.slot_editLoadItem(index) + self.slot_showLoadItem(index) + + def slot_previous_item(self): + print "slot_previous_item" + index = (self.item_list.currentRow() - 1) % self.item_list.count() + self.item_list.setCurrentRow(index) + self.edit_item_selection.setCurrentIndex(index) + self.slot_editLoadItem(index) + self.slot_showLoadItem(index) + + def slot_toggleToolbox(self, index): + if index == 0: + self.toolBar.setEnabled(True) + else: + self.toolBar.setEnabled(False) + + def slot_publish(self): + #QPropertyAnimation animation(self.public_text.palette(), "geometry"); + #animation.setDuration(10000); + #animation.setStartValue(QRect(0, 0, 100, 30)); + #animation.setEndValue(QRect(250, 250, 100, 30)); + #animation.start(); + print "slot_publish" + self.show_public_text.setTextOrHtml(self.show_private_text.textOrHtml()) + + def slot_clear(self): + self.show_public_text.clear() + + def slot_removeItem(self): + text = self.edit_item_selection.currentText() + index = self.edit_item_selection.currentIndex() + title = text.split(": ")[1] + del self.items[title] + self.edit_item_selection.removeItem(index) + self.show_item_selection.removeItem(index) + + def slot_editLoadItem(self, index): + print "slot_editLoadItem", index + itemText = self.edit_item_selection.itemText(index) + position, title = itemText.split(": ", 1) + text, position = self.items[title] + self.edit_private_text.setTextOrHtml(text) + self.item_title.setText(title) + self.item_position_input.setValue(position) + + def slot_showLoadItem(self, index): + public_rect = self.show_public_text.geometry() + global_rect = QtCore.QRect(self.mapToGlobal(public_rect.topLeft()), self.mapToGlobal(public_rect.bottomRight())) + print "slot_showLoadItem", global_rect + item = self.item_list.item(index) + if item is None: + return + title = item.text() + text, index = self.items[title] + self.show_private_text.setHtml(text) + if self.auto_publish_checkbox.isChecked(): + self.show_public_text.setHtml(text) + + def title_by_index(self, ix): + for title, (text, index) in self.items.iteritems(): + if index == ix: + return title + return None + + def slot_changeItem(self, old_title): + print "slot_changeItem" + text, index = self.items.pop(old_title) + new_text = self.edit_private_text.textOrHtml() + new_title = self.item_title.text() + self.items[new_title] = (new_text, index) + self.show_public_text.setTextOrHtml(new_text) + self.item_title.setText(new_title) + self.edit_item_selection.setItemText(index, "%d: %s" % (index, new_title)) + self.item_list.item(index).setText(new_title) + + def slot_addText(self): + print "slot add" + index = self.item_position_input.value() + if index - self.item_list.count() > 1: + old_title = self.edit_item_selection.currentText().split(": ")[1] + self.item_title.setText(old_title) + text, index = self.items[old_title] + self.edit_private_text.setTextOrHtml(text) + self.item_position_input.setValue(index) + return + old_title = self.title_by_index(index) + if old_title is not None: + self.slot_changeItem(old_title) + return + + title = self.item_title.text() + text = self.edit_private_text.textOrHtml() + self.items[title] = (text, index) + self.edit_item_selection.insertItem(index, "%d: %s" % (index, title)) + self.item_list.insertItem(index, title) + self.edit_item_selection.setCurrentIndex(index) + self.item_list.setCurrentRow(index) + + def slot_save(self): + cPickle.dump(self.items, open("448_texter.db", "w"), cPickle.HIGHEST_PROTOCOL) + + def slot_load(self): + try: + self.items = cPickle.load(open("448_texter.db")) + except Exception, e: + print e + + data = list() + for title, (text, index) in self.items.iteritems(): + data.append((title, text, index)) + + data = sorted(data, key=itemgetter(2)) + for title, text, index in data: + self.edit_item_selection.addItem("%d: %s" % (index, title)) + self.item_list.addItem(title) + + self.edit_item_selection.setCurrentIndex(0) + self.item_list.setCurrentRow(0) + title, text, position = data[0] + self.edit_private_text.setTextOrHtml(text) + self.show_private_text.setTextOrHtml(text) + self.item_position_input.setValue(position) + self.item_title.setText(title) + + + +if ( __name__ == '__main__' ): + app = None + if ( not app ): + app = QtGui.QApplication([]) + + window = MainWindow() + window.show() + + if ( app ): + app.exec_() diff --git a/texter/texter.ui b/texter/texter.ui new file mode 100644 index 0000000..8d700e9 --- /dev/null +++ b/texter/texter.ui @@ -0,0 +1,1588 @@ + + + MainWindow + + + 448 Texter + + + + + + + 1 + + + + &Edit + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + &Title + + + item_title + + + + + + + + + + P&osition + + + item_position_input + + + + + + + + + + S&election + + + edit_item_selection + + + + + + + + 0 + 0 + + + + + + + + &Add / Change + + + + + + + &Remove + + + + + + + Sa&ve + + + + + + + + + + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + Monospace + 14 + + + + true + + + true + + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextEditable|Qt::TextEditorInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + + + + + + Sho&w + + + + + + + 640 + 480 + + + + + 640 + 480 + + + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + Monospace + 14 + + + + true + + + + + + true + + + true + + + + + + + + + Next + + + + + + + + + + Previous + + + + + + + &Publish + + + + + + + &Clear + + + + + + + A&uto Publish + + + + + + + + + + + + 0 + 480 + + + + + 16777215 + 480 + + + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + Monospace + 14 + + + + true + + + true + + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextEditable|Qt::TextEditorInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + + + Item + + + item_list + + + + + + + + + + + + clear_button + show_private_text + show_item_selection + publish_button + show_public_text + item_list + label_7 + item_list + item_list + item_list + + + + + + private_text + kbuttongroup + verticalSpacer + item_title + edit_item_selection + tabWidget + + + + + toolBar + + + false + + + false + + + TopToolBarArea + + + false + + + + + + KRichTextEdit + KTextEdit +
krichtextedit.h
+
+ + KTextEdit + QTextEdit +
ktextedit.h
+
+ + KListWidget + QListWidget +
klistwidget.h
+
+ + KRichTextWidget + KRichTextEdit +
krichtextwidget.h
+
+ + KIntNumInput + QWidget +
knuminput.h
+
+
+ + edit_private_text + item_title + item_position_input + edit_item_selection + remove_item_button + + + +