[Rhythmbox-devel] Implementation of RBSearchEntry in python



I needed to add a search box to a plugin that I am working on. Since there are no python bindings for RBSearchEntry, I have implemented a class in python (attached) with the same functionality. Please refer to the documentation for RBSearchEntry for usage.

This class does not make the entry box yellow when a search text is entered.



 


Hotmail: Trusted email with Microsoft’s powerful SPAM protection. Sign up now.
#
# Copyright (C) 2010 Rupesh Kumar
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# The Rhythmbox authors hereby grant permission for non-GPL compatible
# GStreamer plugins to be used and distributed together with GStreamer
# and Rhythmbox. This permission is above and beyond the permissions granted
# by the GPL license by which Rhythmbox is covered. If you modify this code
# you may extend this exception to your version of the code, but you are not
# obligated to do so. If you do not wish to do so, delete this exception
# statement from your version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.

import glib
import gobject
import gtk, gtk.glade
import pygtk

class RBSearchEntry(gtk.HBox) :

    __gsignals__ = {
        'search': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_STRING,)),
        'activate': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_STRING,))
    }

    def __init__ (self) :
        self.__gobject_init__()
        self.entry = gtk.Entry()
        self.entry.set_property("secondary-icon-name", gtk.STOCK_CLEAR)
        self.entry.set_property("secondary-icon-tooltip-text", "Clear the search text")
        self.entry.set_width_chars(30)
        self.label = gtk.Label("Search:")
        self.label.set_justify(gtk.JUSTIFY_RIGHT)
        self.label.set_mnemonic_widget(self.entry)
        self.pack_start(self.label,False,True)
        self.pack_start(self.entry,True,True)
        self.set_spacing(5)
        self.clearing = False
        self.timeout = 0

        self.connect_signals()

    def connect_signals(self):
        self.entry.connect("icon-press", self.entry_clear_cb)
        self.entry.connect("changed", self.entry_changed_cb)
        self.entry.connect("focus-out-event", self.entry_focus_out_cb)
        self.entry.connect("activate", self.entry_active_cb)

    def set_entry_text(self, text):
        self.entry.set_text(text)

    def clear_entry(self):
        if self.timeout != 0:
            glib.source_remove(self.timeout)
            self.timeout = 0
        self.clearing = True
        self.set_entry_text("")
        self.clearing = False

    def entry_changed_cb(self, entry):
        if self.clearing:
            return

        if self.timeout != 0:
            glib.source_remove(self.timeout)
            self.timeout = 0

        if self.entry.get_text() != "":
            self.timeout = glib.timeout_add(300, self.entry_timeout_cb)
        else:
            self.entry_timeout_cb()

    def entry_timeout_cb(self):
        gtk.gdk.threads_enter()
        self.emit('search', self.entry.get_text())
        self.timeout = 0
        gtk.gdk.threads_leave()
        return False

    def entry_focus_out_cb(self, entry, event):
        if self.timeout == 0:
            return False
        glib.source_remove(self.timeout)
        self.timeout = 0
        self.emit('search', self.entry.get_text())
        return False

    def searching(self):
        return self.entry.get_text() == ""

    def entry_active_cb(self):
        self.emit('activate', self.entry.get_text())

    def grab_focus(self):
        self.entry.grab_focus()

    def entry_clear_cb(self, entry, icon_pos, event):
        self.set_entry_text("")

gobject.type_register(RBSearchEntry)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]