| 682 | class CanvasIcon(EventIcon): |
| 683 | """ |
| 684 | An EventIcon with active and prelight states, and a styleable |
| 685 | background. |
| 686 | |
| 687 | If the icon pops up a palette, the prelight state is set until the |
| 688 | palette pops down. |
| 689 | |
| 690 | """ |
| 691 | |
| 692 | __gtype_name__ = 'SugarCanvasIcon' |
| 693 | |
| 694 | def __init__(self, **kwargs): |
| 695 | EventIcon.__init__(self, **kwargs) |
| 696 | |
| 697 | self._prelight_state = False |
| 698 | self._active_state = False |
| 699 | |
| 700 | self.connect('enter-notify-event', self.__enter_notify_event_cb) |
| 701 | self.connect('leave-notify-event', self.__leave_notify_event_cb) |
| 702 | self.connect('button-press-event', self.__button_press_event_cb) |
| 703 | self.connect('button-release-event', self.__button_release_event_cb) |
| 704 | self.palette_invoker.connect('right-click', |
| 705 | self.__invoker_right_click_cb) |
| 706 | |
| 707 | def connect_palette_pop_events(self, palette): |
| 708 | palette.connect('popup', self.__palette_popup_cb) |
| 709 | palette.connect('popdown', self.__palette_popdown_cb) |
| 710 | |
| 711 | def do_draw(self, cr): |
| 712 | """Render a background that fits the allocated space.""" |
| 713 | allocation = self.get_allocation() |
| 714 | context = self.get_style_context() |
| 715 | Gtk.render_background(context, cr, 0, 0, |
| 716 | allocation.width, |
| 717 | allocation.height) |
| 718 | |
| 719 | EventIcon.do_draw(self, cr) |
| 720 | |
| 721 | def _update_states(self): |
| 722 | state = self._active_state if self._active_state \ |
| 723 | else self._prelight_state |
| 724 | self.set_state(state) |
| 725 | |
| 726 | def __enter_notify_event_cb(self, icon, event): |
| 727 | self._prelight_state = Gtk.StateFlags.PRELIGHT |
| 728 | self._update_states() |
| 729 | |
| 730 | def __leave_notify_event_cb(self, icon, event): |
| 731 | if self.palette.is_up(): |
| 732 | return |
| 733 | self._prelight_state = False |
| 734 | self._update_states() |
| 735 | |
| 736 | def __button_press_event_cb(self, icon, event): |
| 737 | self._active_state = Gtk.StateFlags.ACTIVE |
| 738 | self._update_states() |
| 739 | |
| 740 | def __button_release_event_cb(self, icon, event): |
| 741 | self._active_state = False |
| 742 | self._update_states() |
| 743 | |
| 744 | def __invoker_right_click_cb(self, invoker): |
| 745 | self._active_state = False |
| 746 | self._update_states() |
| 747 | |
| 748 | def __palette_popup_cb(self, palette): |
| 749 | self._prelight_state = Gtk.StateFlags.PRELIGHT |
| 750 | self._active_state = False |
| 751 | self._update_states() |
| 752 | |
| 753 | def __palette_popdown_cb(self, palette): |
| 754 | self._prelight_state = False |
| 755 | self._active_state = False |
| 756 | self._update_states() |
| 757 | |
| 758 | |