Added a context menu for most kind of buffers

This commit is contained in:
2016-06-08 05:45:03 -05:00
parent 6ef97389a0
commit 47bab9d2c4
4 changed files with 157 additions and 25 deletions

View File

@@ -13,7 +13,7 @@ from wxUI.tabs import home
from pubsub import pub
from sessionmanager import session
from mysc.thread_utils import call_threaded
from wxUI import commonMessages
from wxUI import commonMessages, menus
from vk import upload
from vk.exceptions import VkAPIMethodError
@@ -21,6 +21,10 @@ log = logging.getLogger("controller.buffers")
class baseBuffer(object):
""" a basic representation of a buffer. Other buffers should be derived from this class"""
def get_post(self):
return self.session.db[self.name]["items"][self.tab.list.get_selected()]
def __init__(self, parent=None, name="", session=None, composefunc=None, *args, **kwargs):
""" parent wx.Treebook: parent for the buffer panel,
name str: Name for saving this buffer's data in the local storage variable,
@@ -38,6 +42,8 @@ class baseBuffer(object):
self.update_function = "get_page"
self.name = name
self.connect_events()
self.user_key = "source_id"
self.post_key = "post_id"
def create_tab(self, parent):
""" Creates the Wx panel."""
@@ -113,8 +119,79 @@ class baseBuffer(object):
def connect_events(self):
widgetUtils.connect_event(self.tab.post, widgetUtils.BUTTON_PRESSED, self.post)
widgetUtils.connect_event(self.tab.list.list, widgetUtils.KEYPRESS, self.get_event)
widgetUtils.connect_event(self.tab.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
widgetUtils.connect_event(self.tab.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
self.tab.set_focus_function(self.onFocus)
def show_menu(self, ev, pos=0, *args, **kwargs):
if self.tab.list.get_count() == 0: return
menu = self.get_menu()
if pos != 0:
self.tab.PopupMenu(menu, pos)
else:
self.tab.PopupMenu(menu, ev.GetPosition())
def show_menu_by_key(self, ev):
if self.tab.list.get_count() == 0:
return
if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU:
self.show_menu(widgetUtils.MENU, pos=self.tab.list.list.GetPosition())
def get_menu(self):
m = menus.postMenu()
p = self.get_post()
if p.has_key("likes") == False:
m.like.Enable(False)
elif p["likes"]["user_likes"] == 1:
m.like.Enable(False)
m.dislike.Enable(True)
if p.has_key("comments") == False:
m.comment.Enable(False)
widgetUtils.connect_event(m, widgetUtils.MENU, self.open_post, menuitem=m.open)
widgetUtils.connect_event(m, widgetUtils.MENU, self.do_like, menuitem=m.like)
widgetUtils.connect_event(m, widgetUtils.MENU, self.do_dislike, menuitem=m.dislike)
widgetUtils.connect_event(m, widgetUtils.MENU, self.do_comment, menuitem=m.comment)
return m
def do_like(self, *args, **kwargs):
post = self.get_post()
user = post[self.user_key]
id = post[self.post_key]
if post.has_key("type"):
type_ = post["type"]
else:
type_ = "post"
l = self.session.vk.client.likes.add(owner_id=user, item_id=id, type=type_)
self.session.db[self.name]["items"][self.tab.list.get_selected()]["likes"]["count"] = l["likes"]
self.session.db[self.name]["items"][self.tab.list.get_selected()]["likes"]["user_likes"] = 1
output.speak(_(u"You liked this"))
def do_dislike(self, *args, **kwargs):
post = self.get_post()
user = post[self.user_key]
id = post[self.post_key]
if post.has_key("type"):
type_ = post["type"]
else:
type_ = "post"
l = self.session.vk.client.likes.delete(owner_id=user, item_id=id, type=type_)
self.session.db[self.name]["items"][self.tab.list.get_selected()]["likes"]["count"] = l["likes"]
self.session.db[self.name]["items"][self.tab.list.get_selected()]["likes"]["user_likes"] = 2
output.speak(_(u"You don't like this"))
def do_comment(self, *args, **kwargs):
comment = messages.comment(title=_(u"Add a comment"), caption="", text="")
if comment.message.get_response() == widgetUtils.OK:
msg = comment.message.get_text().encode("utf-8")
post = self.get_post()
try:
user = post[self.user_key]
id = post[self.post_key]
self.session.vk.client.wall.addComment(owner_id=user, post_id=id, text=msg)
output.speak(_(u"You've posted a comment"))
except Exception as msg:
print msg
def get_event(self, ev):
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown() and ev.ShiftDown(): event = "pause_audio"
elif ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "play_audio"
@@ -141,7 +218,7 @@ class baseBuffer(object):
if post.has_key("type") and post["type"] == "audio":
pub.sendMessage("play-audio", audio_object=post["audio"]["items"][0])
def open_post(self):
def open_post(self, *args, **kwargs):
post = self.session.db[self.name]["items"][self.tab.list.get_selected()]
if post.has_key("type") and post["type"] == "audio":
a = posts.audio(self.session, post["audio"]["items"])
@@ -209,6 +286,11 @@ class feedBuffer(baseBuffer):
else:
return False
def __init__(self, *args, **kwargs):
super(feedBuffer, self).__init__(*args, **kwargs)
self.user_key = "from_id"
self.post_key = "id"
class audioBuffer(feedBuffer):
def create_tab(self, parent):
self.tab = home.audioTab(parent)
@@ -222,7 +304,7 @@ class audioBuffer(feedBuffer):
selected = self.tab.list.get_selected()
pub.sendMessage("play-audio", audio_object=self.session.db[self.name]["items"][selected])
def open_post(self):
def open_post(self, *args, **kwargs):
selected = self.tab.list.get_selected()
audios = [self.session.db[self.name]["items"][selected]]
a = posts.audio(self.session, audios)
@@ -257,6 +339,39 @@ class audioBuffer(feedBuffer):
def onFocus(self, *args, **kwargs):
pass
def add_to_library(self, *args, **kwargs):
post = self.get_post()
args = {}
args["audio_id"] = post["id"]
if post.has_key("album_id"):
args["album_id"] = post["album_id"]
args["owner_id"] = post["owner_id"]
audio = self.session.vk.client.audio.add(**args)
if audio != None and int(audio) > 21:
output.speak(_(u"Audio added to your library"))
def remove_from_library(self, *args, **kwargs):
post = self.get_post()
args = {}
args["audio_id"] = post["id"]
args["owner_id"] = self.session.user_id
result = self.session.vk.client.audio.delete(**args)
if int(result) == 1:
output.speak(_(u"Removed audio from library"))
def get_menu(self):
p = self.get_post()
m = menus.audioMenu()
widgetUtils.connect_event(m, widgetUtils.MENU, self.open_post, menuitem=m.open)
widgetUtils.connect_event(m, widgetUtils.MENU, self.play_audio, menuitem=m.play)
# if owner_id is the current user, the audio is added to the user's audios.
if p["owner_id"] == self.session.user_id:
m.library.SetItemLabel(_(u"&Remove from library"))
widgetUtils.connect_event(m, widgetUtils.MENU, self.remove_from_library, menuitem=m.library)
else:
widgetUtils.connect_event(m, widgetUtils.MENU, self.add_to_library, menuitem=m.library)
return m
class empty(object):
def __init__(self, name=None, parent=None, *args, **kwargs):
@@ -336,3 +451,12 @@ class peopleBuffer(feedBuffer):
original_date = arrow.get(post["last_seen"]["time"])
created_at = original_date.humanize(locale=languageHandler.getLanguage())
self.tab.list.list.SetStringItem(self.tab.list.get_selected(), 1, created_at)
def open_timeline(self, *args, **kwargs):
pass
def get_menu(self, *args, **kwargs):
m = menus.peopleMenu()
widgetUtils.connect_event(m, widgetUtils.MENU, self.new_chat, menuitem=m.message)
widgetUtils.connect_event(m, widgetUtils.MENU, self.open_timeline, menuitem=m.timeline)
return m

View File

@@ -92,6 +92,7 @@ class Controller(object):
timelines = buffers.empty(parent=self.window.tb, name="timelines")
self.buffers.append(timelines)
self.window.add_buffer(timelines.tab, _(u"Timelines"))
self.window.realize()
def connect_events(self):
log.debug("Connecting events to responses...")
@@ -143,7 +144,6 @@ class Controller(object):
self.status_setter.start()
self.set_online()
self.create_unread_messages()
self.window.realize()
def in_post(self, buffer):
buffer = self.search(buffer)
buffer.get_items()

View File

@@ -8,13 +8,14 @@ class postMenu(wx.Menu):
self.AppendItem(self.open)
self.like = wx.MenuItem(self, wx.NewId(), _(u"Like"))
self.AppendItem(self.like)
self.unlike = wx.MenuItem(self, wx.NewId(), _(u"Unlike"))
self.AppendItem(self.unlike)
self.dislike = wx.MenuItem(self, wx.NewId(), _(u"Dislike"))
self.dislike.Enable(False)
self.AppendItem(self.dislike)
self.comment = wx.MenuItem(self, wx.NewId(), _(u"Add comment"))
self.AppendItem(self.comment)
self.post_in_wall = self.Append(wx.NewId(), _(u"Post to this profile"))
self.AppendItem(self.post_in_wall)
self.post_in_wall = wx.MenuItem(self, wx.NewId(), _(u"Post to this profile"))
self.post_in_wall.Enable(False)
self.AppendItem(self.post_in_wall)
def create_specific_post_options(self):
self.update = wx.MenuItem(self, wx.NewId(), _(u"Update"))
@@ -22,6 +23,28 @@ class postMenu(wx.Menu):
self.delete = wx.MenuItem(self, wx.NewId(), _(u"Delete"))
self.AppendItem(self.delete)
class audioMenu(wx.Menu):
def __init__(self, *args, **kwargs):
super(audioMenu, self).__init__(*args, **kwargs)
self.open = wx.MenuItem(self, wx.NewId(), _(u"&Open"))
self.AppendItem(self.open)
self.play = wx.MenuItem(self, wx.NewId(), _(u"&Play"))
self.AppendItem(self.play)
self.library = wx.MenuItem(self, wx.NewId(), _(u"&Add to library"))
self.AppendItem(self.library)
class peopleMenu(wx.Menu):
def __init__(self, *args, **kwargs):
super(peopleMenu, self).__init__(*args, **kwargs)
self.view_profile = wx.MenuItem(self, wx.NewId(), _(u"View profile"))
self.AppendItem(self.view_profile)
self.message = wx.MenuItem(self, wx.NewId(), _(u"Send a message"))
self.AppendItem(self.message)
self.timeline = wx.MenuItem(self, wx.NewId(), _(u"Open timeline"))
self.AppendItem(self.timeline)
self.view_profile.Enable(False)
class commentMenu(wx.Menu):
def __init__(self, *args, **kwargs):
super(commentMenu, self).__init__(*args, **kwargs)
@@ -41,20 +64,3 @@ class notificationsMenu(wx.Menu):
super(notificationsMenu, self).__init__()
self.mark_as_read = wx.MenuItem(self, wx.NewId(), _(u"Mark as read"))
self.AppendItem(self.mark_as_read)
class toolsMenu(wx.Menu):
def __init__(self, *args, **kwargs):
super(toolsMenu, self).__init__(*args, **kwargs)
self.url = wx.MenuItem(self, -1, _(u"Open URL"))
self.AppendItem(self.url)
# self.url.Enable(False)
self.translate = wx.MenuItem(self, -1, _(u"Translate"))
self.AppendItem(self.translate)
self.CheckSpelling = wx.MenuItem(self, -1, _(u"Check Spelling"))
self.AppendItem(self.CheckSpelling)
class attachMenu(wx.Menu):
def __init__(self):
super(attachMenu, self).__init__()
self.photo = wx.MenuItem(self, wx.NewId(), _(u"Picture"))
self.AppendItem(self.photo)