Skip to content

Commit

Permalink
Add support for subtitles with modifier keys
Browse files Browse the repository at this point in the history
  • Loading branch information
deanishe committed May 11, 2014
1 parent 49acf86 commit 042125c
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 13 deletions.
Binary file modified alfred-workflow.zip
Binary file not shown.
57 changes: 53 additions & 4 deletions tests/test_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def tearDown(self):

def test_item_creation(self):
"""XML generation"""
self.wf.add_item('title', 'subtitle', 'arg',
self.wf.add_item('title', 'subtitle', arg='arg',
autocomplete='autocomplete',
valid=True, uid='uid', icon='icon.png',
icontype='fileicon',
Expand All @@ -106,7 +106,8 @@ def test_item_creation(self):
sys.stdout = stdout
output = sio.getvalue()
sio.close()
# pprint(output)
from pprint import pprint
pprint(output)
root = ET.fromstring(output)
item = list(root)[0]
self.assertEqual(item.attrib['uid'], 'uid')
Expand All @@ -124,10 +125,58 @@ def test_item_creation(self):
self.assertEqual(icon.tag, 'icon')
self.assertEqual(icon.attrib['type'], 'fileicon')

def test_item_creation_with_modifiers(self):
"""XML generation (with modifiers)"""
mod_subs = {}
for mod in ('cmd', 'ctrl', 'alt', 'shift', 'fn'):
mod_subs[mod] = mod
self.wf.add_item('title', 'subtitle',
mod_subs,
arg='arg',
autocomplete='autocomplete',
valid=True, uid='uid', icon='icon.png',
icontype='fileicon',
type='file')
stdout = sys.stdout
sio = StringIO()
sys.stdout = sio
self.wf.send_feedback()
sys.stdout = stdout
output = sio.getvalue()
sio.close()
from pprint import pprint
pprint(output)
root = ET.fromstring(output)
item = list(root)[0]
self.assertEqual(item.attrib['uid'], 'uid')
self.assertEqual(item.attrib['autocomplete'], 'autocomplete')
self.assertEqual(item.attrib['valid'], 'yes')
self.assertEqual(item.attrib['uid'], 'uid')
(title, subtitle, sub_cmd, sub_ctrl, sub_alt, sub_shift, sub_fn, arg,
icon) = list(item)
self.assertEqual(title.text, 'title')
self.assertEqual(title.tag, 'title')
self.assertEqual(subtitle.text, 'subtitle')
self.assertEqual(sub_cmd.text, 'cmd')
self.assertEqual(sub_cmd.attrib['mod'], 'cmd')
self.assertEqual(sub_ctrl.text, 'ctrl')
self.assertEqual(sub_ctrl.attrib['mod'], 'ctrl')
self.assertEqual(sub_alt.text, 'alt')
self.assertEqual(sub_alt.attrib['mod'], 'alt')
self.assertEqual(sub_shift.text, 'shift')
self.assertEqual(sub_shift.attrib['mod'], 'shift')
self.assertEqual(sub_fn.text, 'fn')
self.assertEqual(sub_fn.attrib['mod'], 'fn')
self.assertEqual(subtitle.tag, 'subtitle')
self.assertEqual(arg.text, 'arg')
self.assertEqual(arg.tag, 'arg')
self.assertEqual(icon.text, 'icon.png')
self.assertEqual(icon.tag, 'icon')
self.assertEqual(icon.attrib['type'], 'fileicon')

def test_item_creation_no_optionals(self):
"""XML generation (no optionals)"""
self.wf.add_item('title',
valid=False)
self.wf.add_item('title')
stdout = sys.stdout
sio = StringIO()
sys.stdout = sio
Expand Down
2 changes: 1 addition & 1 deletion workflow/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ def main(wf):
"""

__version__ = '1.4.2'
__version__ = '1.4.3'

from .workflow import Workflow, PasswordNotFound, KeychainError
from .workflow import (ICON_ERROR, ICON_WARNING, ICON_NOTE, ICON_INFO,
Expand Down
27 changes: 19 additions & 8 deletions workflow/workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -457,15 +457,16 @@ class Item(object):
"""

def __init__(self, title, subtitle='', arg=None, autocomplete=None,
valid=False, uid=None, icon=None, icontype=None,
type=None):
def __init__(self, title, subtitle='', modifier_subtitles=None,
arg=None, autocomplete=None, valid=False, uid=None,
icon=None, icontype=None, type=None):
"""Arguments the same as for :meth:`Workflow.add_item`.
"""

self.title = title
self.subtitle = subtitle
self.modifier_subtitles = modifier_subtitles or {}
self.arg = arg
self.autocomplete = autocomplete
self.valid = valid
Expand Down Expand Up @@ -497,6 +498,12 @@ def elem(self):
root = ET.Element('item', attr)
ET.SubElement(root, 'title').text = self.title
ET.SubElement(root, 'subtitle').text = self.subtitle
# Add modifier subtitles
for mod in ('cmd', 'ctrl', 'alt', 'shift', 'fn'):
if mod in self.modifier_subtitles:
ET.SubElement(root, 'subtitle',
{'mod': mod}).text = self.modifier_subtitles[mod]

if self.arg:
ET.SubElement(root, 'arg').text = self.arg
# Add icon if there is one
Expand Down Expand Up @@ -1224,15 +1231,19 @@ def run(self, func):

# Alfred feedback methods ------------------------------------------

def add_item(self, title, subtitle='', arg=None, autocomplete=None,
valid=False, uid=None, icon=None, icontype=None,
type=None):
def add_item(self, title, subtitle='', modifier_subtitles=None, arg=None,
autocomplete=None, valid=False, uid=None, icon=None,
icontype=None, type=None):
"""Add an item to be output to Alfred
:param title: Title shown in Alfred
:type title: ``unicode``
:param subtitle: Subtitle shown in Alfred
:type subtitle: ``unicode``
:param modifier_subtitles: Subtitles shown when modifier
(CMD, OPT etc.) is pressed. Use a ``dict`` with the lowercase
keys ``cmd``, ``ctrl``, ``shift``, ``alt`` and ``fn``
:type modifier_subtitles: ``dict``
:param arg: Argument passed by Alfred as `{query}` when item is
actioned
:type arg: ``unicode``
Expand Down Expand Up @@ -1260,8 +1271,8 @@ def add_item(self, title, subtitle='', arg=None, autocomplete=None,
"""

item = self.item_class(title, subtitle, arg, autocomplete, valid,
uid, icon, icontype, type)
item = self.item_class(title, subtitle, modifier_subtitles, arg,
autocomplete, valid, uid, icon, icontype, type)
self._items.append(item)
return item

Expand Down

0 comments on commit 042125c

Please sign in to comment.