Changeset 1909

Show
Ignore:
Timestamp:
23/11/08 05:28:15 (7 weeks ago)
Author:
duncan
svm:headrev:

cc3e1ea1-1e01-0410-8d68-8b121e83a9d5:11191
Message:

[ 2308911 ] Skinable Dialogs
More patches from Adam Charrett applied

Location:
freevo/src
Files:
12 modified

Legend:

Unmodified
Added
Removed
  • freevo/src/dialog/__init__.py

    r1901 r1909  
    124124    return _display 
    125125 
     126def is_dialog_supported(): 
     127    """ 
     128    Retrieve whether the current display supports graphics dialogs or not. 
     129    @return: True if the display supports graphics dialogs, False if not. 
     130    """ 
     131    if _display: 
     132        return _display.supports_dialogs 
     133 
     134    return False 
     135 
     136def is_dialog_showing(): 
     137    """ 
     138    Retrieve whether a dialog is currently being displayed. 
     139 
     140    @return: True if a dialog is being displayed, False if not. 
     141    """ 
     142    if _display and _display.supports_dialogs: 
     143        return _display.current_dialog != None 
     144 
     145    return False 
    126146 
    127147def show_volume(level, muted, channel=None): 
     
    183203        return _display.handle_event(event) 
    184204    return False 
     205 
     206def handle_mouse_event(event): 
     207    if _display and hasattr(_display, 'handle_mouse_event'): 
     208        _display.handle_mouse_event(event) 
  • freevo/src/dialog/dialogs.py

    r1901 r1909  
    4040""" 
    4141import time 
    42  
     42import pygame.event 
     43from pygame.locals import * 
    4344import config 
    4445import rc 
     
    383384 
    384385        return handled 
     386 
     387    def handle_mouse_event(self, evt): 
     388        widget = self.skin.get_widget_at(evt.pos) 
     389 
     390        if widget is None: 
     391            return 
     392        new_pos = (evt.pos[0] - self.skin.position[0], evt.pos[1] - self.skin.position[1]) 
     393        evt_dict = {'pos':new_pos} 
     394        if evt.type == MOUSEMOTION: 
     395            evt_dict['rel'] = evt.rel 
     396            evt_dict['buttons'] = evt.buttons 
     397        if evt.type in (MOUSEBUTTONDOWN , MOUSEBUTTONUP): 
     398            evt_dict['button'] = evt.button 
     399        evt = pygame.event.Event(evt.type, evt_dict) 
     400        if widget in self.widgets: 
     401            widget_model = self.widgets[widget] 
     402            if evt.type == MOUSEMOTION: 
     403                widget_model.set_active(True) 
     404            if hasattr(widget_model, 'handle_mouse_event'): 
     405                widget_model.handle_mouse_event(evt) 
    385406 
    386407    def get_info_dict(self): 
  • freevo/src/dialog/display.py

    r1901 r1909  
    5353 
    5454import dialogs 
     55 
     56from pygame.locals import * 
    5557 
    5658class Display(object): 
     
    218220        return super(GraphicsDisplay,self).handle_event(evt) 
    219221 
     222    def handle_mouse_event(self, evt): 
     223        if self.current_dialog and hasattr(self.current_dialog, 'handle_mouse_event'): 
     224            self.current_dialog.handle_mouse_event(evt) 
     225 
     226 
    220227    def show_volume(self, level, muted, channel=None): 
    221228        if self.volume_dialog is None: 
     
    248255 
    249256                now = time.time() 
     257 
    250258                left = self.current_time_details[1] - (now - self.current_time_details[0]) 
    251                 _debug_('Queuing current dialog, time left %f' % left) 
    252                 self.waiting[self.current_dialog.priority] = (self.current_dialog, left, True) 
    253                 # We don't finish the dialog as we will be displaying it again when 
    254                 # the higher priority dialog closes. 
     259                if left > 0.0: 
     260                    _debug_('Queuing current dialog, time left %f' % left) 
     261                    self.waiting[self.current_dialog.priority] = (self.current_dialog, left, True) 
     262                    # We don't finish the dialog as we will be displaying it again when 
     263                    # the higher priority dialog closes. 
     264                else: 
     265                    # No time left on the clock for this dialog so finish it. 
     266                    self.current_dialog.finish() 
    255267                self.hide_dialog_timer.stop() 
    256268                self.current_dialog = None 
     
    304316            self.hide_image() 
    305317            _debug_('Closing dialog priority %s' % priority) 
    306             # Now check lower priority waiting queue for 
     318            # Now check lower priority waiting queue for any dialogs waiting to be displayed 
    307319            if priority == dialogs.Dialog.HIGH_PRIORITY: 
    308320                priority = dialogs.Dialog.NORMAL_PRIORITY 
  • freevo/src/dialog/widgets.py

    r1901 r1909  
    3737""" 
    3838import kaa 
     39from pygame.locals import * 
    3940 
    4041class WidgetModel(object): 
     
    141142        return super(ButtonModel, self).handle_event(event) 
    142143 
    143     def press(self): 
     144    def handle_mouse_event(self, event): 
     145        if event.type == MOUSEBUTTONDOWN: 
     146            self.press(False) 
     147 
     148        elif event.type == MOUSEBUTTONUP: 
     149            self.__unpress() 
     150 
     151 
     152    def press(self, keyboard=True): 
    144153        """ 
    145154        Press the button. 
     
    147156        self.pressed = True 
    148157        self.redraw() 
    149         self.pressed_timer.start(0.2) 
     158        if keyboard: 
     159            self.pressed_timer.start(0.2) 
    150160 
    151161    def __unpress(self): 
     
    309319        return super(MenuModel, self).handle_event(event) 
    310320 
     321    def handle_mouse_event(self, event): 
     322        if event.type == MOUSEMOTION: 
     323            y = event.pos[1] - self.position[1] 
     324            size_per_item = self.size[1] / self.items_per_page 
     325            scroll_height = size_per_item / 4 
     326            if y <= scroll_height  and self.offset >= 1: 
     327                self.offset -= 1 
     328                self.__update_page() 
     329                self.redraw() 
     330            if y >= (self.size[1] - scroll_height) and (self.offset + self.items_per_page) < len(self.items): 
     331                self.offset += 1 
     332                self.__update_page() 
     333                self.redraw() 
     334 
     335            idx = (y / size_per_item) + self.offset 
     336            self.items[self.active_item].active = False 
     337            self.active_item = idx 
     338            self.items[self.active_item].active = True 
     339            self.redraw() 
     340        if event.type == MOUSEBUTTONDOWN or event.type == MOUSEBUTTONUP: 
     341            self.items[self.active_item].handle_mouse_event(event) 
     342 
     343 
    311344    def activate_item(self, item): 
    312345        """ 
     
    360393        self.redraw() 
    361394 
    362     def layout(self, items_per_page): 
     395    def layout(self, items_per_page, position, size): 
    363396        """ 
    364397        Called by the skin to layout this menu. 
    365398        @param items_per_page: The number of items that are to be displayed on a page. 
    366399        """ 
     400        self.position = position 
     401        self.size = size 
    367402        self.offset = 0 
    368403        self.active_item = 0 
     
    448483            self.redraw() 
    449484 
    450     def press(self): 
     485    def press(self, keyboard=True): 
    451486        self.set_selected(not self.selected) 
    452487 
  • freevo/src/osd.py

    r1900 r1909  
    4747import rc 
    4848import util 
    49  
     49import dialog 
    5050 
    5151if __freevo_app__ == 'main': 
     
    497497            if config.SYS_USE_MOUSE: 
    498498                if event.type == MOUSEMOTION: 
     499                    if dialog.is_dialog_showing(): 
     500                        dialog.handle_mouse_event(event) 
     501                        # Swallow all mouse events if a dialog is showing even if not over a widget. 
     502                        continue 
    499503                    app = self.focused_app() 
    500504                    # Menu 
     
    520524 
    521525                if event.type == MOUSEBUTTONDOWN: 
     526                    if dialog.is_dialog_showing(): 
     527                        dialog.handle_mouse_event(event) 
     528                        # Swallow all mouse events if a dialog is showing even if not over a widget. 
     529                        continue 
    522530                    app = self.focused_app() 
    523531                    # Menu 
     
    565573                        elif event.button == 3: 
    566574                            app.destroy() 
     575 
     576            if event.type == MOUSEBUTTONUP: 
     577                if dialog.is_dialog_showing(): 
     578                    dialog.handle_mouse_event(event) 
     579                    # Swallow all mouse events if a dialog is showing even if not over a widget. 
     580                    continue 
    567581 
    568582            if event.type == KEYDOWN: 
  • freevo/src/plugin.py

    r1790 r1909  
    148148 
    149149    def poll_wrapper(self): 
    150         if self.poll_menu_only and rc.app(): 
     150        import skin 
     151        if self.poll_menu_only and not skin.active(): 
    151152            return 
    152153        self.real_poll() 
  • freevo/src/skins/osd/skin.py

    r1900 r1909  
    9898    def add(self, obj): 
    9999        self.objects.append(obj) 
     100 
     101    def get_widget_at(self, pos): 
     102        if pos[0] > self.position[0] and pos[0] < self.position[0] + self.size[0] and \ 
     103            pos[1] > self.position[1] and pos[1] < self.position[1] + self.size[1]: 
     104            x = pos[0] - self.position[0] 
     105            y = pos[1] - self.position[1] 
     106            for obj in self.objects: 
     107                if isinstance(obj, OSDWidget): 
     108                    if x > obj.pos[0] and x < obj.pos[0] + obj.size[0] and \ 
     109                        y > obj.pos[1] and y < obj.pos[1] + obj.size[1]: 
     110                        return obj.name 
     111        return None 
    100112 
    101113 
     
    516528    def render_widget(self, image, model): 
    517529        if self.first_render: 
    518             model.layout(self.items_per_page) 
     530            model.layout(self.items_per_page, self.pos, self.size) 
    519531 
    520532 
  • freevo/src/tv/plugins/ivtv_xine_tv.py

    r1679 r1909  
    4848import tv.epg_xmltv as epg 
    4949import util.tv_util as tvutil 
     50 
     51import dialog 
     52from dialog.display import AppTextDisplay 
    5053 
    5154from event import * 
     
    342345 
    343346        self.tuner.SetChannelByName(channel, True) 
     347        dialog.enable_overlay_display(AppTextDisplay(self.xine.ShowMessage)) 
    344348 
    345349        _debug_('Started %r app' % self.mode) 
     
    349353        """ Stop the xine player """ 
    350354        _debug_('XineIvtv.Stop()', 1) 
     355        dialog.disable_overlay_display() 
    351356        confirmstop_time = int(time.time()) 
    352357        # note: the OSD msg is displayed for 5 seconds 
  • freevo/src/tv/plugins/mplayer.py

    r1890 r1909  
    4242import tv.ivtv as ivtv 
    4343import plugin 
     44import dialog 
     45from dialog.display import AppTextDisplay 
     46 
    4447 
    4548 
     
    283286            mixer.setPcmVolume(mixer_vol) 
    284287 
     288        dialog.enable_overlay_display(AppTextDisplay(self.show_message)) 
    285289        _debug_('%s: started %s app' % (time.time(), self.mode)) 
    286290 
     
    417421 
    418422        return False 
     423 
     424    def show_message(self, message): 
     425        self.app.write('osd_show_text "%s"\n' % message) 
  • freevo/src/tv/plugins/xine.py

    r1537 r1909  
    4242import util 
    4343import osd 
    44  
     44import dialog 
     45from dialog.display import AppTextDisplay 
    4546from tv.channels import FreevoChannels 
    4647 
     
    144145 
    145146        self.app = childapp.ChildApp2(command) 
     147        dialog.enable_overlay_display(AppTextDisplay(self.ShowMessage)) 
    146148        return None 
    147149 
     
    154156            self.app.stop('quit\n') 
    155157            rc.app(None) 
     158            dialog.disable_overlay_display() 
    156159 
    157160            if not channel_change: 
  • freevo/src/video/plugins/mplayer.py

    r1885 r1909  
    3939import rc         # The RemoteControl class. 
    4040import plugin 
     41import dialog 
     42from dialog.display import AppTextDisplay 
    4143 
    4244from event import * 
     
    360362        rc.app(self) 
    361363        self.app = MPlayerApp(command, self) 
     364        dialog.enable_overlay_display(AppTextDisplay(self.show_message)) 
    362365        return None 
    363366 
     
    375378        self.app.stop('quit\n') 
    376379        rc.app(None) 
     380        dialog.disable_overlay_display() 
    377381        self.app = None 
    378382 
     
    487491 
    488492        if event == OSD_MESSAGE: 
    489             self.app.write('osd_show_text "%s"\n' % event.arg); 
     493            self.show_message(event.arg) 
    490494            return True 
    491495 
     
    493497        return self.item.eventhandler(event) 
    494498 
     499    def show_message(self, message): 
     500        self.app.write('osd_show_text "%s"\n' % message); 
    495501 
    496502    def reset_seek(self): 
  • freevo/src/video/plugins/xine.py

    r1638 r1909  
    5050import plugin 
    5151 
     52import dialog 
     53from dialog.display import AppTextDisplay 
    5254 
    5355class PluginInterface(plugin.Plugin): 
     
    98100        self.app       = None 
    99101        self.plugins   = [] 
     102        self.paused    = False 
    100103 
    101104        self.command = [ '--prio=%s' % config.MPLAYER_NICE ] + \ 
     
    215218 
    216219        self.app = XineApp(command, self) 
     220        dialog.enable_overlay_display(AppTextDisplay(self.ShowMessage)) 
    217221        return None 
    218222 
     
    243247        self.app.stop('quit\n') 
    244248        rc.app(None) 
     249        dialog.disable_overlay_display() 
    245250        self.app = None 
    246251 
     
    260265 
    261266        if event == PAUSE or event == PLAY: 
     267            self.paused = not self.paused 
     268            dialog.show_play_state(self.paused and dialog.PLAY_STATE_PAUSE or dialog.PLAY_STATE_PLAY, None) 
    262269            self.app.write('pause\n') 
    263270            return True 
     
    272279                action='SeekRelative-' 
    273280                pos = 0 - pos 
     281                dialog.show_play_state(dialog.PLAY_STATE_SEEK_BACK, None) 
    274282            else: 
    275283                action='SeekRelative+' 
     284                dialog.show_play_state(dialog.PLAY_STATE_SEEK_FORWARD, None) 
    276285            if pos <= 15: 
    277286                pos = 15 
     
    384393            return True 
    385394 
    386         if event == OSD_MESSAGE: 
    387             self.ShowMessage(event.arg) 
    388             return True 
    389  
    390395        # nothing found? Try the eventhandler of the object who called us 
    391396        return self.item.eventhandler(event)