Reviewers: ,
Please review this at http://codereview.tryton.org/594002/
Affected files:
A tryton/common/placeholder_entry.py
M tryton/gui/window/view_form/view/form_gtk/many2many.py
M tryton/gui/window/view_form/view/form_gtk/one2many.py
M tryton/gui/window/view_form/view/screen_container.py
Index: tryton/common/placeholder_entry.py
===================================================================
new file mode 100644
--- /dev/null
+++ b/tryton/common/placeholder_entry.py
@@ -0,0 +1,66 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+import gtk
+
+
+class PlaceholderEntry(gtk.Entry):
+
+ _placeholder = ''
+ _default = True
+
+ def __init__(self, *args, **kwargs):
+ super(PlaceholderEntry, self).__init__(*args, **kwargs)
+ style = self.get_style()
+ self._text_color_normal = style.text[gtk.STATE_NORMAL]
+ self._text_color_placeholder = style.text[gtk.STATE_INSENSITIVE]
+ self.connect('focus-in-event', PlaceholderEntry._focus_in)
+ self.connect('focus-out-event', PlaceholderEntry._focus_out)
+
+ def _focus_in(self, event):
+ if self._default:
+ super(PlaceholderEntry, self).set_text('')
+ self.modify_text(gtk.STATE_NORMAL, self._text_color_normal)
+ self._default = False
+
+ def _focus_out(self, event=None):
+ if super(PlaceholderEntry, self).get_text() == '':
+ super(PlaceholderEntry, self).set_text(self._placeholder)
+ self.modify_text(gtk.STATE_NORMAL,
self._text_color_placeholder)
+ self._default = True
+ else:
+ self._default = False
+
+ def set_placeholder_text(self, text):
+ self._placeholder = text
+ if not self.has_focus():
+ self._focus_out()
+
+ def get_text(self):
+ if self._default:
+ return ''
+ return super(PlaceholderEntry, self).get_text()
+
+ def set_text(self, text):
+ super(PlaceholderEntry, self).set_text(text)
+ if not self.has_focus():
+ self._focus_out()
+
+if __name__ == '__main__':
+ win = gtk.Window()
+ win.set_title('PlaceholderEntry')
+
+ def cb(window, event):
+ gtk.main_quit()
+ win.connect('delete-event', cb)
+ vbox = gtk.VBox()
+ win.add(vbox)
+
+ entry = gtk.Entry()
+ vbox.pack_start(entry)
+
+ placeholder_entry = PlaceholderEntry()
+ placeholder_entry.set_placeholder_text('Placeholder')
+ vbox.pack_start(placeholder_entry)
+
+ win.show_all()
+ gtk.main()
Index: tryton/gui/window/view_form/view/form_gtk/many2many.py
===================================================================
--- a/tryton/gui/window/view_form/view/form_gtk/many2many.py
+++ b/tryton/gui/window/view_form/view/form_gtk/many2many.py
@@ -9,6 +9,7 @@
import tryton.common as common
import gettext
from tryton.common import RPCExecute, RPCException
+from tryton.common.placeholder_entry import PlaceholderEntry
_ = gettext.gettext
@@ -33,7 +34,8 @@
tooltips = common.Tooltips()
- self.wid_text = gtk.Entry()
+ self.wid_text = PlaceholderEntry()
+ self.wid_text.set_placeholder_text(_('Search'))
self.wid_text.set_property('width_chars', 13)
self.wid_text.connect('activate', self._sig_activate)
self.wid_text.connect('focus-out-event', self._focus_out)
@@ -41,7 +43,7 @@
hbox.pack_start(self.wid_text, expand=True, fill=True)
self.but_add = gtk.Button()
- tooltips.set_tip(self.but_add, _('Add'))
+ tooltips.set_tip(self.but_add, _('Add existing record'))
self.but_add.connect('clicked', self._sig_add)
self.but_add.connect('enter-notify-event', self.enter)
img_add = gtk.Image()
@@ -53,7 +55,7 @@
hbox.pack_start(self.but_add, expand=False, fill=False)
self.but_remove = gtk.Button()
- tooltips.set_tip(self.but_remove, _('Remove <Del>'))
+ tooltips.set_tip(self.but_remove, _('Remove selected record
<Del>'))
self.but_remove.connect('clicked', self._sig_remove)
self.but_remove.connect('enter-notify-event', self.enter)
img_remove = gtk.Image()
Index: tryton/gui/window/view_form/view/form_gtk/one2many.py
===================================================================
--- a/tryton/gui/window/view_form/view/form_gtk/one2many.py
+++ b/tryton/gui/window/view_form/view/form_gtk/one2many.py
@@ -9,6 +9,7 @@
from tryton.config import CONFIG
import tryton.common as common
from tryton.common import RPCExecute, RPCException
+from tryton.common.placeholder_entry import PlaceholderEntry
_ = gettext.gettext
@@ -37,14 +38,15 @@
self.focus_out = True
if attrs.get('add_remove'):
- self.wid_text = gtk.Entry()
+ self.wid_text = PlaceholderEntry()
+ self.wid_text.set_placeholder_text(_('Search'))
self.wid_text.set_property('width_chars', 13)
self.wid_text.connect('activate', self._sig_activate)
self.wid_text.connect('focus-out-event', self._focus_out)
hbox.pack_start(self.wid_text, expand=True, fill=True)
self.but_add = gtk.Button()
- tooltips.set_tip(self.but_add, _('Add'))
+ tooltips.set_tip(self.but_add, _('Add existing record'))
self.but_add.connect('clicked', self._sig_add)
self.but_add.connect('enter-notify-event', self.enter)
img_add = gtk.Image()
@@ -56,7 +58,8 @@
hbox.pack_start(self.but_add, expand=False, fill=False)
self.but_remove = gtk.Button()
- tooltips.set_tip(self.but_remove, _('Remove <Del>'))
+ tooltips.set_tip(self.but_remove,
+ _('Remove selected record'))
self.but_remove.connect('clicked', self._sig_remove, True)
self.but_remove.connect('enter-notify-event', self.enter)
img_remove = gtk.Image()
Index: tryton/gui/window/view_form/view/screen_container.py
===================================================================
--- a/tryton/gui/window/view_form/view/screen_container.py
+++ b/tryton/gui/window/view_form/view/screen_container.py
@@ -8,6 +8,7 @@
import tryton.common as common
from tryton.common.domain_parser import quote
+from tryton.common.placeholder_entry import PlaceholderEntry
from tryton.translate import date_format
from tryton.config import TRYTON_ICON
from tryton.pyson import PYSONDecoder
@@ -52,7 +53,8 @@
self.filter_button.connect('toggled', self.search_box)
hbox.pack_start(self.filter_button, expand=False, fill=False)
- self.search_entry = gtk.Entry()
+ self.search_entry = PlaceholderEntry()
+ self.search_entry.set_placeholder_text(_('Search'))
self.search_entry.set_alignment(0.0)
self.completion = gtk.EntryCompletion()
self.completion.set_model(gtk.ListStore(str))
--
[email protected] mailing list