# HG changeset patch # User Marcin Kuzminski # Date 1276463644 -7200 # Node ID cd2ee462fc2c6c880034972e9b3e32dc0f40d19d # Parent 373ddb868bd636c5d62a1b9da6fd56a8456a17d4 implemented yui tooltip, and added it into annotation and main page. diff -r 373ddb868bd6 -r cd2ee462fc2c pylons_app/lib/helpers.py --- a/pylons_app/lib/helpers.py Sun Jun 13 18:18:49 2010 +0200 +++ b/pylons_app/lib/helpers.py Sun Jun 13 23:14:04 2010 +0200 @@ -9,11 +9,12 @@ from pylons.i18n.translation import _, ungettext from vcs.utils.annotate import annotate_highlight from webhelpers.html import literal, HTML, escape +from webhelpers.html.tools import * from webhelpers.html.builder import make_tag from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \ end_form, file, form, hidden, image, javascript_link, link_to, link_to_if, \ link_to_unless, ol, required_legend, select, stylesheet_link, submit, text, \ - password, textarea, title, ul, xml_declaration + password, textarea, title, ul, xml_declaration, radio from webhelpers.html.tools import auto_link, button_to, highlight, js_obfuscate, \ mail_to, strip_links, strip_tags, tag_re from webhelpers.number import format_byte_size, format_bit_size @@ -21,10 +22,10 @@ from webhelpers.pylonslib.secure_form import secure_form from webhelpers.text import chop_at, collapse, convert_accented_entities, \ convert_misc_entities, lchop, plural, rchop, remove_formatting, \ - replace_whitespace, urlify, truncate + replace_whitespace, urlify, truncate, wrap_paragraphs -#Custom helper here :) +#Custom helpers here :) class _Link(object): ''' Make a url based on label and url with help of url_for @@ -38,6 +39,7 @@ link_fn = link_to(label, url(*url_, **urlargs)) return link_fn +link = _Link() class _GetError(object): @@ -46,18 +48,104 @@ if form_errors and form_errors.has_key(field_name): return literal(tmpl % form_errors.get(field_name)) +get_error = _GetError() + +def recursive_replace(str, replace=' '): + """ + Recursive replace of given sign to just one instance + @param str: given string + @param replace:char to find and replace multiple instances + + Examples:: + >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-') + 'Mighty-Mighty-Bo-sstones' + """ + + if str.find(replace * 2) == -1: + return str + else: + str = str.replace(replace * 2, replace) + return recursive_replace(str, replace) + +class _ToolTip(object): + + def __call__(self, tooltip_title, trim_at=50): + """ + Special function just to wrap our text into nice formatted autowrapped + text + @param tooltip_title: + """ + + return literal(wrap_paragraphs(tooltip_title, trim_at)\ + .replace('\n', '
')) + + def activate(self): + """ + Adds tooltip mechanism to the given Html all tooltips have to have + set class tooltip and set attribute tooltip_title. + Then a tooltip will be generated based on that + All with yui js tooltip + """ + + js = ''' + YAHOO.util.Event.onDOMReady(function(){ + function toolTipsId(){ + var ids = []; + var tts = YAHOO.util.Dom.getElementsByClassName('tooltip'); + + for (var i = 0; i < tts.length; i++) { + //if element doesn not have and id autgenerate one for tooltip + + if (!tts[i].id){ + tts[i].id='tt'+i*100; + } + ids.push(tts[i].id); + } + return ids + }; + var myToolTips = new YAHOO.widget.Tooltip("tooltip", { + context: toolTipsId(), + monitorresize:false, + xyoffset :[0,0], + autodismissdelay:300000, + hidedelay:5, + showdelay:20, + }); + + //Mouse subscribe optional arguments + myToolTips.contextMouseOverEvent.subscribe( + function(type, args) { + var context = args[0]; + return true; + }); + + // Set the text for the tooltip just before we display it. Lazy method + myToolTips.contextTriggerEvent.subscribe( + function(type, args) { + var context = args[0]; + var txt = context.getAttribute('tooltip_title'); + this.cfg.setProperty("text", txt); + }); + }); + ''' + return literal(js) + +tooltip = _ToolTip() + class _FilesBreadCrumbs(object): def __call__(self, repo_name, rev, paths): url_l = [link_to(repo_name, url('files_home', repo_name=repo_name, revision=rev, f_path=''))] - paths_l = paths.split('/') + paths_l = paths.split(' / ') for cnt, p in enumerate(paths_l, 1): if p != '': - url_l.append(link_to(p, url('files_home', repo_name=repo_name, revision=rev, f_path='/'.join(paths_l[:cnt])))) + url_l.append(link_to(p, url('files_home', repo_name=repo_name, revision=rev, f_path=' / '.join(paths_l[:cnt])))) return literal(' / '.join(url_l)) +files_breadcrumbs = _FilesBreadCrumbs() + def pygmentize(filenode, **kwargs): """ pygmentize function using pygments @@ -81,32 +169,28 @@ else: color_dict[cs] = gen_color() col = color_dict[cs] - return "color: rgb(%s) ! important;" % (','.join(col)) + return "color: rgb(%s) ! important;" % (', '.join(col)) def url_func(changeset): - return '%s\n' % (link_to('r%s:%s' % (changeset.revision, changeset.raw_id), - url('changeset_home', repo_name='test', revision=changeset.raw_id), - title=_('author') + ':%s - %s' % (changeset.author, changeset.message,), - style=get_color_string(changeset.raw_id))) - + tooltip_html = "
Author: %s
Date: %s
Message: %s
" + + tooltip_html = tooltip_html % (changeset.author, + changeset.date, + tooltip(changeset.message)) + lnk_format = 'r%s:%s' % (changeset.revision, + changeset.raw_id) + uri = link_to( + lnk_format, + url('changeset_home', repo_name='test', + revision=changeset.raw_id), + style=get_color_string(changeset.raw_id), + class_='tooltip', + tooltip_title=tooltip_html + ) + + uri += '\n' + return uri return literal(annotate_highlight(filenode, url_func, **kwargs)) - -def recursive_replace(str, replace=' '): - """ - Recursive replace of given sign to just one instance - @param str: given string - @param replace:char to find and replace multiple instances - - Examples:: - >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-') - 'Mighty-Mighty-Bo-sstones' - """ - - if str.find(replace * 2) == -1: - return str - else: - str = str.replace(replace * 2, replace) - return recursive_replace(str, replace) def repo_name_slug(value): """ @@ -117,8 +201,5 @@ slug = slug.replace(c, '-') slug = recursive_replace(slug, '-') return slug - -files_breadcrumbs = _FilesBreadCrumbs() -link = _Link() + flash = _Flash() -get_error = _GetError() diff -r 373ddb868bd6 -r cd2ee462fc2c pylons_app/lib/utils.py --- a/pylons_app/lib/utils.py Sun Jun 13 18:18:49 2010 +0200 +++ b/pylons_app/lib/utils.py Sun Jun 13 23:14:04 2010 +0200 @@ -143,7 +143,8 @@ class EmptyChangeset(BaseChangeset): revision = -1 - + message = '' + @LazyProperty def raw_id(self): """ diff -r 373ddb868bd6 -r cd2ee462fc2c pylons_app/model/hg_model.py --- a/pylons_app/model/hg_model.py Sun Jun 13 18:18:49 2010 +0200 +++ b/pylons_app/model/hg_model.py Sun Jun 13 23:14:04 2010 +0200 @@ -148,6 +148,7 @@ tmp_d['contact'] = repo.contact tmp_d['contact_sort'] = tmp_d['contact'] tmp_d['repo_archives'] = list(repo._get_archives()) + tmp_d['last_msg'] = tip.message yield tmp_d diff -r 373ddb868bd6 -r cd2ee462fc2c pylons_app/public/css/monoblue_custom.css --- a/pylons_app/public/css/monoblue_custom.css Sun Jun 13 18:18:49 2010 +0200 +++ b/pylons_app/public/css/monoblue_custom.css Sun Jun 13 23:14:04 2010 +0200 @@ -156,6 +156,31 @@ .error-message{ color:#CC3300; } +/**** Tooltip ****/ +.yui-overlay, +.yui-panel-container { + visibility:hidden; + position:absolute; + z-index: 2; +} + +.yui-tt { + visibility:hidden; + position:absolute; + color:#666666; + background-color:#FFFFFF; + font-family:arial,helvetica,verdana,sans-serif; + padding:8px; + border:2px solid #556CB5; + font:100% sans-serif; + width:auto; +} + +.yui-tt-shadow { + display: none; +} +/** end of Tooltip **/ + div#main { padding: 5px; diff -r 373ddb868bd6 -r cd2ee462fc2c pylons_app/templates/base/base.html --- a/pylons_app/templates/base/base.html Sun Jun 13 18:18:49 2010 +0200 +++ b/pylons_app/templates/base/base.html Sun Jun 13 23:14:04 2010 +0200 @@ -28,6 +28,7 @@
${next.main()} +