diff --git a/Qt/Bungloo.py b/Qt/Bungloo.py index 6a065e7..e5eaf3e 100755 --- a/Qt/Bungloo.py +++ b/Qt/Bungloo.py @@ -107,15 +107,12 @@ class Controller(QtCore.QObject): QtCore.QObject.__init__(self) self.app = app - oldpath = os.path.expanduser('~/.bungloo/') - if os.path.isdir(oldpath): - shutil.copytree(oldpath, os.path.expanduser('~/.config/bungloo/')) - shutil.rmtree(os.path.expanduser('~/.bungloo/')) + name = "bungloo2" - if not os.path.exists(os.path.expanduser("~/.config/bungloo/")): - os.makedirs(os.path.expanduser("~/.config/bungloo/")) + if not os.path.exists(os.path.expanduser("~/.config/" + name + "/")): + os.makedirs(os.path.expanduser("~/.config/" + name + "/")) - self.config_path = os.path.expanduser('~/.config/bungloo/bungloo.cfg') + self.config_path = os.path.expanduser('~/.config/' + name + '/bungloo.cfg') if os.access(self.config_path, os.R_OK): with open(self.config_path, 'r') as f: @@ -180,15 +177,12 @@ class Controller(QtCore.QObject): @QtCore.pyqtSlot(str, str, str, bool) def openNewMessageWindowInReplyTostatusIdwithStringIsPrivate(self, entity, status_id, string, is_private): - new_message_window = Windows.NewPost(self.app) - new_message_window.inReplyToStatusIdWithString(entity, status_id, string) - new_message_window.setIsPrivate(is_private) + new_message_window = Windows.NewPost(self.app, string, "[]", is_private) new_message_window.show() new_message_window.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.app.new_message_windows.append(new_message_window) new_message_window.activateWindow() new_message_window.setFocus() - new_message_window.textInput.setFocus() new_message_window.show() new_message_window.raise_() @@ -268,6 +262,11 @@ class Controller(QtCore.QObject): msgBox.setInformativeText(message) msgBox.exec_() + @QtCore.pyqtSlot(result=str) + def getCachedEntities(self): + entities = self.app.timeline.evaluateJavaScript("JSON.stringify(bungloo.cache.entities);") + return entities.toString() + def logout(self, sender): print "logout is not implemented yet" @@ -297,7 +296,7 @@ class Console(QtCore.QObject): if __name__ == "__main__": - key = 'BUNGLOO' + key = 'BUNGLOO2' if len(sys.argv) > 1 and sys.argv[1] == "--help": print """ diff --git a/Qt/Windows.py b/Qt/Windows.py index b47d8ae..7317f56 100644 --- a/Qt/Windows.py +++ b/Qt/Windows.py @@ -242,7 +242,7 @@ class Oauth: new_manager.sslErrors.connect(lambda reply, errors: self.handleSslErrors(reply, errors)) self.auth_view.page().setNetworkAccessManager(new_manager) self.auth_view.show() - + print url self.auth_view.load_url(url) return False @@ -329,25 +329,29 @@ class FindEntity(QtGui.QDialog): class NewPost(Helper.RestorableWindow): - def __init__(self, app): + def __init__(self, app, string, mentions, is_private): self.app = app + self.string = string + self.mentions = mentions + self.is_private = is_private + Helper.RestorableWindow.__init__(self, "newpost", self.app) + self.activateWindow() + self.raise_() self.setWindowIcon(QtGui.QIcon(self.app.resources_path() + "/images/Icon.png")) - self.textInput = QtGui.QPlainTextEdit(self) - self.setCentralWidget(self.textInput) - self.textInput.textChanged.connect(self.onChanged) + self.webView = Helper.WebViewCreator(self.app, True, self) + self.webView.load_local(self.load_finished) + self.setCentralWidget(self.webView) + + self.initUI() + + self.webView.triggerPageAction(QtWebKit.QWebPage.InspectElement) self.setWindowTitle("New Post") self.resize(300, 150) self.setMinimumSize(100, 100) - self.initUI() - - self.setIsPrivate(False) - self.status_id = None - self.reply_to_entity = None - self.imageFilePath = None def initUI(self): newPostAction = QtGui.QAction("&New Post", self) @@ -396,69 +400,29 @@ class NewPost(Helper.RestorableWindow): aboutAction.setStatusTip("Open about page in Webbrowser") aboutAction.triggered.connect(self.app.open_about) + developerExtrasAction = QtGui.QAction("&Developer Extras", self) + developerExtrasAction.setStatusTip("Activate webkit inspector") + developerExtrasAction.triggered.connect(self.developer_extras) + helpMenu = menubar.addMenu("&Help") helpMenu.addAction(aboutAction) + helpMenu.addAction(developerExtrasAction) - self.statusBar().showMessage('256') + def load_finished(self, widget): + is_private = "false" + if self.is_private: + is_private = "true" - self.addButton = QtGui.QToolButton() - self.addButton.setToolTip("Add photo") - self.addButton.clicked.connect(self.openFileDialog) - self.addButton.setAutoRaise(True) - #addIcon = QtGui.QIcon.fromTheme("insert-image", QtGui.QIcon(self.app.resources_path() + "/images/Actions-insert-image-icon.png")) - addIcon = QtGui.QIcon(self.app.resources_path() + "/images/glyphicons_138_picture.png") - self.addButton.setIcon(addIcon) - self.statusBar().addPermanentWidget(self.addButton) + callback = "function() { bungloo.newpost.setString('%s'); bungloo.newpost.setIsPrivate(%s); bungloo.newpost.setMentions(%s);}" % (self.string, is_private, self.mentions) - self.isPrivateButton = QtGui.QToolButton() - self.isPrivateButton.setToolTip("Make private") - self.isPrivateButton.clicked.connect(self.toggleIsPrivate) - self.isPrivateButton.setAutoRaise(True) - #self.isPrivateIcon = QtGui.QIcon(self.app.resources_path() + "/images/Lock-Lock-icon.png") - self.isPrivateIcon = QtGui.QIcon(self.app.resources_path() + "/images/glyphicons_203_lock.png") - #self.isNotPrivateIcon = QtGui.QIcon(self.app.resources_path() + "/images/Lock-Unlock-icon.png") - self.isNotPrivateIcon = QtGui.QIcon(self.app.resources_path() + "/images/glyphicons_204_unlock.png") - self.isPrivateButton.setIcon(self.isNotPrivateIcon) - self.statusBar().addPermanentWidget(self.isPrivateButton) - - self.sendButton = QtGui.QToolButton() - self.sendButton.setToolTip("Send") - self.sendButton.clicked.connect(self.sendMessage) - self.sendButton.setAutoRaise(True) - #sendIcon = QtGui.QIcon.fromTheme("mail-send", QtGui.QIcon(self.app.resources_path() + "/images/send-icon.png")) - sendIcon = QtGui.QIcon(self.app.resources_path() + "/images/glyphicons_123_message_out.png") - self.sendButton.setIcon(sendIcon) - self.statusBar().addPermanentWidget(self.sendButton) - - def setIsPrivate(self, is_private): - self.isPrivate = is_private - icon = self.isNotPrivateIcon - if self.isPrivate: - icon = self.isPrivateIcon - - self.isPrivateButton.setIcon(icon) + script = "function HostAppGo() { start('newpost', " + callback + "); }" + self.webView.page().mainFrame().evaluateJavaScript(script) + self.webView.setFocus() def toggleIsPrivate(self): - self.setIsPrivate(not self.isPrivate) - - def setString(self, string): - self.inReplyToStatusIdWithString(None, None, string) - - def inReplyToStatusIdWithString(self, reply_to, status_id, string): - self.reply_to_entity = reply_to - self.status_id = status_id - self.textInput.setPlainText(string) - - cursor = self.textInput.textCursor() - cursor.movePosition(QtGui.QTextCursor.End, QtGui.QTextCursor.MoveAnchor) - cursor.movePosition(QtGui.QTextCursor.Start, QtGui.QTextCursor.KeepAnchor) - cursor.movePosition(QtGui.QTextCursor.EndOfLine, QtGui.QTextCursor.KeepAnchor) - self.textInput.setTextCursor(cursor) - - def onChanged(self): - count = 256 - len(self.textInput.toPlainText()) - self.statusBar().showMessage(str(count)) + script = "bungloo.newpost.toggleIsPrivate();" + self.webView.page().mainFrame().evaluateJavaScript(script) def sendMessage(self): count = len(self.textInput.toPlainText()) @@ -482,3 +446,7 @@ class NewPost(Helper.RestorableWindow): else: self.imageFilePath = None + def developer_extras(self, widget): + QtWebKit.QWebSettings.globalSettings().setAttribute(QtWebKit.QWebSettings.DeveloperExtrasEnabled, True) + + diff --git a/WebKit/css/default.css b/WebKit/css/default.css index ff8bbfd..63bd2e8 100644 --- a/WebKit/css/default.css +++ b/WebKit/css/default.css @@ -446,4 +446,18 @@ form.search input { p.noresult { padding : 10px; text-align : center; -} \ No newline at end of file +} + +.new_post #sidebar, .new_post #content { display: none; } +.new_post { height: 100%; } +#new_post_container { position: absolute; border-collapse: collapse; height: 100%; width: 100%; } +#new_post_container td { position: relative; height: 90%; } +#new_post_container .text td { background: white; } +#new_post_container textarea { resize: none; box-sizing: border-box; position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; background: transparent; outline: none; } +#new_post_container div { box-sizing: border-box; position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; background: white; color: white; padding: 2px; } + +#new_post_container div span { background: #D8DFEA; } +#suggestions { position: absolute; left: 0; bottom: 0; } +#suggestions .active { color: red; } +#status_bar { height: 1em; } +#status_bar p { float: right; } \ No newline at end of file diff --git a/WebKit/scripts/controller/NewPost.js b/WebKit/scripts/controller/NewPost.js new file mode 100644 index 0000000..113c58c --- /dev/null +++ b/WebKit/scripts/controller/NewPost.js @@ -0,0 +1,197 @@ +define([ +], + +function() { + + function NewPost() { + + this.entities = JSON.parse(controller.getCachedEntities()); + this.mentions = []; + this.is_private = false; + document.body.className = "new_post"; + + // Textarea + + this.container = $("
" + + "" + + "" + + "" + + "
"); + + this.buttons = { + images: buttons.find("#images"), + is_private: buttons.find("#private"), + send: buttons.find("#send") + } + + //this.buttons.images.bind("click", this.addImage.bind(this)); + //this.buttons.is_private.bind("click", this.togglePrivate.bind(this)); + this.buttons.send.bind("click", this.send.bind(this)); + + this.container.find("#status_bar").append(this.counter); + this.container.find("#status_bar").append(buttons); + + this.textarea.focus() + } + + NewPost.prototype.setString = function(string) { + this.textarea.val(string); + } + + NewPost.prototype.setMentions = function(mentions) { + + if(mentions && mentions.length > 0) { + var mentions_string = " "; + for (var i = 0; i < mentions.length; i++) { + mentions_string += mentions[i].name + " "; + } + + this.textarea.val(this.textarea.val() + " " + mentions_string); + this.mentions = mentions; + } + this.keyup(); + } + + NewPost.prototype.setIsPrivate = function(is_private) { + this.is_private = is_private; + } + + NewPost.prototype.toggleIsPrivate = function() { + this.is_private = !this.is_private; + }; + + NewPost.prototype.keyup = function(e) { + if(!e) return; + + var key = e.which; + if(key != 38 && key != 40 && key != 13) { + + this.applyText($(this.textarea).val()); + + } else { + + var lis = this.suggestions.find("li"); + + if (lis.length > 0) { + e.preventDefault(); + var active = this.suggestions.find(".active"); + if(key == 38) { // up + var prev = active.prev(); + if(active.lentgh == 0) { + lis.last().addClass("active"); + } else if(prev) { + active.removeClass("active"); + prev.addClass("active"); + } + } else if(key == 40) { // down + var next = active.next(); + if(active.length == 0) { + lis.first().addClass("active"); + } else if(next) { + active.removeClass("active"); + next.addClass("active"); + } + } else if(key == 13) { // enter + if(active.length > 0) { + this.replaceWithName(this.textarea.val(), this.suggestions.find("li.active").get(0).item); + } + } + } + } + } + + NewPost.prototype.keydown = function(e) { + var key = e.which; + var lis = this.suggestions.find("li"); + if(lis.length > 0 && (key == 38 || key == 40 || key == 13)) { + e.preventDefault(); + } + } + + NewPost.prototype.replaceAll = function(txt, replace, with_this) { + return txt.replace(new RegExp(replace, 'g'),with_this); + } + + NewPost.prototype.replaceWithName = function(txt, with_item) { + var words = txt.match(/(^|\s)\^([^\s]+)/); + var replace = words[2]; + + var original = txt.replace("^" + replace, with_item.name); + this.textarea.val(original); + + this.mentions.push(with_item); + + this.applyText(original); + } + + NewPost.prototype.applyText = function (text) { + var words = text.match(/(^|\s)\^([^\s]+)/); + this.suggestions.html(""); + + if(words) { + var name = words[2]; + for (var key in this.entities.length) { + var item = this.entities[key]; + if(item.name.toLowerCase().indexOf(name.toLowerCase()) != -1 || item.entity.toLowerCase().indexOf(name.toLowerCase()) != -1) { + var li = $("