Changeset 340

Show
Ignore:
Timestamp:
06/29/06 21:29:34 (2 years ago)
Author:
nicfit
Message:

Tab drag-and-drop reordering (closes #153)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/po/es.po

    r335 r340  
    88"Project-Id-Version: 0.1.1\n" 
    99"Report-Msgid-Bugs-To: \n" 
    10 "POT-Creation-Date: 2006-06-27 14:19-0600\n" 
     10"POT-Creation-Date: 2006-06-27 23:31-0600\n" 
    1111"PO-Revision-Date: 2006-04-15 17:38-0600\n" 
    1212"Last-Translator: Travis Shirk <travis@pobox.com>\n" 
     
    2525 
    2626#: ../src/mesk_gui.glade.h:1 
     27msgid "+" 
     28msgstr "" 
     29 
     30#: ../src/mesk_gui.glade.h:2 
     31msgid "-" 
     32msgstr "" 
     33 
     34#: ../src/mesk_gui.glade.h:3 
    2735msgid "--:--" 
    2836msgstr "--:--" 
    2937 
    30 #: ../src/mesk_gui.glade.h:2 
     38#: ../src/mesk_gui.glade.h:4 
    3139msgid "<b>Author:</b>" 
    3240msgstr "<b>Autor:</b>" 
    3341 
    34 #: ../src/mesk_gui.glade.h:3 
     42#: ../src/mesk_gui.glade.h:5 
    3543msgid "<b>Copyright:</b>" 
    3644msgstr "<b>Copyright:</b>" 
    3745 
    38 #: ../src/mesk_gui.glade.h:4 
     46#: ../src/mesk_gui.glade.h:6 
    3947msgid "<b>Description:</b>" 
    4048msgstr "<b>Descripción:</b>" 
    4149 
    42 #: ../src/mesk_gui.glade.h:5 
     50#: ../src/mesk_gui.glade.h:7 
    4351msgid "<b>Plugin Name</b>" 
    4452msgstr "<b>Nombre Plugin</b>" 
    4553 
    46 #: ../src/mesk_gui.glade.h:6 
     54#: ../src/mesk_gui.glade.h:8 
    4755msgid "<b>URL:</b>" 
    4856msgstr "<b>URL:</b>" 
    4957 
    50 #: ../src/mesk_gui.glade.h:7 
     58#: ../src/mesk_gui.glade.h:9 
    5159msgid "" 
    5260"<big>Welcome To <b>Mesk</b></big>\n" 
     
    5563msgstr "" 
    5664 
    57 #: ../src/mesk_gui.glade.h:10 
     65#: ../src/mesk_gui.glade.h:12 
    5866msgid "Add Music..." 
    5967msgstr "Agregue La Música" 
    6068 
    61 #: ../src/mesk_gui.glade.h:11 
     69#: ../src/mesk_gui.glade.h:13 
    6270msgid "Add music..." 
    6371msgstr "Agregue la música" 
    6472 
    65 #: ../src/mesk_gui.glade.h:12 
     73#: ../src/mesk_gui.glade.h:14 
    6674msgid "CD Audio" 
    6775msgstr "" 
    6876 
    69 #: ../src/mesk_gui.glade.h:13 
     77#: ../src/mesk_gui.glade.h:15 
    7078msgid "Clear Queue" 
    7179msgstr "Coleta Clara" 
    7280 
    73 #: ../src/mesk_gui.glade.h:14 
     81#: ../src/mesk_gui.glade.h:16 
    7482msgid "Clear search" 
    7583msgstr "Búsqueda clara" 
    7684 
    77 #: ../src/mesk_gui.glade.h:15 
     85#: ../src/mesk_gui.glade.h:17 
    7886msgid "Close search" 
    7987msgstr "Búsqueda cercana" 
    8088 
    81 #: ../src/mesk_gui.glade.h:16 
     89#: ../src/mesk_gui.glade.h:18 
    8290msgid "Configure..." 
    8391msgstr "Configure..." 
    8492 
    85 #: ../src/mesk_gui.glade.h:17 
     93#: ../src/mesk_gui.glade.h:19 
    8694msgid "Copyright © 2006 Travis Shirk" 
    8795msgstr "Copyright © 2006 Travis Shirk" 
    8896 
    89 #: ../src/mesk_gui.glade.h:18 
     97#: ../src/mesk_gui.glade.h:20 
    9098msgid "Find:" 
    9199msgstr "Hallazgo:" 
    92100 
    93 #: ../src/mesk_gui.glade.h:19 
     101#: ../src/mesk_gui.glade.h:21 
    94102msgid "First" 
    95103msgstr "" 
    96104 
    97 #: ../src/mesk_gui.glade.h:20 
     105#: ../src/mesk_gui.glade.h:22 
    98106msgid "Mesk" 
    99107msgstr "Mesk" 
    100108 
    101 #: ../src/mesk_gui.glade.h:21 
     109#: ../src/mesk_gui.glade.h:23 
    102110msgid "Next" 
    103111msgstr "Después" 
    104112 
    105 #: ../src/mesk_gui.glade.h:22 
     113#: ../src/mesk_gui.glade.h:24 
    106114msgid "Online Help" 
    107115msgstr "Ayuda En línea" 
    108116 
    109117#. Tooltip strings 
    110 #: ../src/mesk_gui.glade.h:23 ../src/audio_control.py:42 
     118#: ../src/mesk_gui.glade.h:25 ../src/audio_control.py:43 
    111119msgid "Play" 
    112120msgstr "Juego" 
    113121 
    114 #: ../src/mesk_gui.glade.h:24 ../src/mesk/__init__.py:46 
     122#: ../src/mesk_gui.glade.h:26 ../src/mesk/__init__.py:46 
    115123msgid "Playlist" 
    116124msgstr "Playlist" 
    117125 
    118 #: ../src/mesk_gui.glade.h:25 
    119 #, fuzzy 
    120 msgid "Playlist Name" 
    121 msgstr "Playlist" 
    122  
    123 #: ../src/mesk_gui.glade.h:26 
     126#: ../src/mesk_gui.glade.h:27 
    124127msgid "Playlist stats" 
    125128msgstr "Playlist stats" 
    126129 
    127 #: ../src/mesk_gui.glade.h:27 
     130#: ../src/mesk_gui.glade.h:28 
    128131msgid "Plugins" 
    129132msgstr "Plugins" 
    130133 
    131 #: ../src/mesk_gui.glade.h:28 
     134#: ../src/mesk_gui.glade.h:29 
    132135msgid "Preferences" 
    133136msgstr "Preferencias" 
    134137 
    135 #: ../src/mesk_gui.glade.h:29 
     138#: ../src/mesk_gui.glade.h:30 
    136139msgid "Previous" 
    137140msgstr "Anterior" 
    138141 
    139 #: ../src/mesk_gui.glade.h:30 
     142#: ../src/mesk_gui.glade.h:31 
    140143msgid "Queue" 
    141144msgstr "Coleta" 
    142145 
    143 #: ../src/mesk_gui.glade.h:31 
     146#: ../src/mesk_gui.glade.h:32 
    144147msgid "Queue/Unqueue" 
    145148msgstr "Coleta/Unqueue" 
    146149 
    147 #: ../src/mesk_gui.glade.h:32 
     150#: ../src/mesk_gui.glade.h:33 
    148151msgid "Remove" 
    149152msgstr "Quite" 
    150  
    151 #: ../src/mesk_gui.glade.h:33 
    152 msgid "Rename..." 
    153 msgstr "" 
    154153 
    155154#: ../src/mesk_gui.glade.h:34 
     
    265264msgstr "Formato audio sin apoyo: %s" 
    266265 
    267 #: ../src/audio_control.py:43 
     266#: ../src/audio_control.py:44 
    268267msgid "Pause" 
    269268msgstr "Pausa" 
    270269 
    271 #: ../src/audio_control.py:120 
     270#: ../src/audio_control.py:133 
    272271#, python-format 
    273272msgid "Gstreamer version %d.%d.%d audio control initialized" 
    274273msgstr "El control audio de la versión %d.%d.%d de Gstreamer se inicializó" 
     274 
     275#: ../src/audio_control.py:309 
     276#, python-format 
     277msgid "Volume %d%%" 
     278msgstr "" 
    275279 
    276280#. we talk about file 
     
    304308msgstr "La gerencia de la sesión inhabilitó (ningún módulo de gnome.ui)" 
    305309 
    306 #: ../src/main_window.py:73 ../src/main_window.py:394 
    307 #, python-format 
    308 msgid "Volume %d%%" 
    309 msgstr "" 
    310  
    311 #: ../src/main_window.py:110 
     310#: ../src/main_window.py:105 
    312311#, python-format 
    313312msgid "Error loading playlist '%s'" 
     
    711710 
    712711#, fuzzy 
     712#~ msgid "Playlist Name" 
     713#~ msgstr "Playlist" 
     714 
     715#, fuzzy 
    713716#~ msgid "item2" 
    714717#~ msgstr "Título" 
  • trunk/po/mesk.pot

    r335 r340  
    99"Project-Id-Version: PACKAGE VERSION\n" 
    1010"Report-Msgid-Bugs-To: \n" 
    11 "POT-Creation-Date: 2006-06-27 14:19-0600\n" 
     11"POT-Creation-Date: 2006-06-27 23:31-0600\n" 
    1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
    1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 
     
    2626 
    2727#: ../src/mesk_gui.glade.h:1 
     28msgid "+" 
     29msgstr "" 
     30 
     31#: ../src/mesk_gui.glade.h:2 
     32msgid "-" 
     33msgstr "" 
     34 
     35#: ../src/mesk_gui.glade.h:3 
    2836msgid "--:--" 
    2937msgstr "" 
    3038 
    31 #: ../src/mesk_gui.glade.h:2 
     39#: ../src/mesk_gui.glade.h:4 
    3240msgid "<b>Author:</b>" 
    3341msgstr "" 
    3442 
    35 #: ../src/mesk_gui.glade.h:3 
     43#: ../src/mesk_gui.glade.h:5 
    3644msgid "<b>Copyright:</b>" 
    3745msgstr "" 
    3846 
    39 #: ../src/mesk_gui.glade.h:4 
     47#: ../src/mesk_gui.glade.h:6 
    4048msgid "<b>Description:</b>" 
    4149msgstr "" 
    4250 
    43 #: ../src/mesk_gui.glade.h:5 
     51#: ../src/mesk_gui.glade.h:7 
    4452msgid "<b>Plugin Name</b>" 
    4553msgstr "" 
    4654 
    47 #: ../src/mesk_gui.glade.h:6 
     55#: ../src/mesk_gui.glade.h:8 
    4856msgid "<b>URL:</b>" 
    4957msgstr "" 
    5058 
    51 #: ../src/mesk_gui.glade.h:7 
     59#: ../src/mesk_gui.glade.h:9 
    5260msgid "" 
    5361"<big>Welcome To <b>Mesk</b></big>\n" 
     
    5664msgstr "" 
    5765 
    58 #: ../src/mesk_gui.glade.h:10 
     66#: ../src/mesk_gui.glade.h:12 
    5967msgid "Add Music..." 
    6068msgstr "" 
    6169 
    62 #: ../src/mesk_gui.glade.h:11 
     70#: ../src/mesk_gui.glade.h:13 
    6371msgid "Add music..." 
    6472msgstr "" 
    6573 
    66 #: ../src/mesk_gui.glade.h:12 
     74#: ../src/mesk_gui.glade.h:14 
    6775msgid "CD Audio" 
    6876msgstr "" 
    6977 
    70 #: ../src/mesk_gui.glade.h:13 
     78#: ../src/mesk_gui.glade.h:15 
    7179msgid "Clear Queue" 
    7280msgstr "" 
    7381 
    74 #: ../src/mesk_gui.glade.h:14 
     82#: ../src/mesk_gui.glade.h:16 
    7583msgid "Clear search" 
    7684msgstr "" 
    7785 
    78 #: ../src/mesk_gui.glade.h:15 
     86#: ../src/mesk_gui.glade.h:17 
    7987msgid "Close search" 
    8088msgstr "" 
    8189 
    82 #: ../src/mesk_gui.glade.h:16 
     90#: ../src/mesk_gui.glade.h:18 
    8391msgid "Configure..." 
    8492msgstr "" 
    8593 
    86 #: ../src/mesk_gui.glade.h:17 
     94#: ../src/mesk_gui.glade.h:19 
    8795msgid "Copyright © 2006 Travis Shirk" 
    8896msgstr "" 
    8997 
    90 #: ../src/mesk_gui.glade.h:18 
     98#: ../src/mesk_gui.glade.h:20 
    9199msgid "Find:" 
    92100msgstr "" 
    93101 
    94 #: ../src/mesk_gui.glade.h:19 
     102#: ../src/mesk_gui.glade.h:21 
    95103msgid "First" 
    96104msgstr "" 
    97105 
    98 #: ../src/mesk_gui.glade.h:20 
     106#: ../src/mesk_gui.glade.h:22 
    99107msgid "Mesk" 
    100108msgstr "" 
    101109 
    102 #: ../src/mesk_gui.glade.h:21 
     110#: ../src/mesk_gui.glade.h:23 
    103111msgid "Next" 
    104112msgstr "" 
    105113 
    106 #: ../src/mesk_gui.glade.h:22 
     114#: ../src/mesk_gui.glade.h:24 
    107115msgid "Online Help" 
    108116msgstr "" 
    109117 
    110118#. Tooltip strings 
    111 #: ../src/mesk_gui.glade.h:23 ../src/audio_control.py:42 
     119#: ../src/mesk_gui.glade.h:25 ../src/audio_control.py:43 
    112120msgid "Play" 
    113121msgstr "" 
    114122 
    115 #: ../src/mesk_gui.glade.h:24 ../src/mesk/__init__.py:46 
     123#: ../src/mesk_gui.glade.h:26 ../src/mesk/__init__.py:46 
    116124msgid "Playlist" 
    117125msgstr "" 
    118126 
    119 #: ../src/mesk_gui.glade.h:25 
    120 msgid "Playlist Name" 
    121 msgstr "" 
    122  
    123 #: ../src/mesk_gui.glade.h:26 
     127#: ../src/mesk_gui.glade.h:27 
    124128msgid "Playlist stats" 
    125129msgstr "" 
    126130 
    127 #: ../src/mesk_gui.glade.h:27 
     131#: ../src/mesk_gui.glade.h:28 
    128132msgid "Plugins" 
    129133msgstr "" 
    130134 
    131 #: ../src/mesk_gui.glade.h:28 
     135#: ../src/mesk_gui.glade.h:29 
    132136msgid "Preferences" 
    133137msgstr "" 
    134138 
    135 #: ../src/mesk_gui.glade.h:29 
     139#: ../src/mesk_gui.glade.h:30 
    136140msgid "Previous" 
    137141msgstr "" 
    138142 
    139 #: ../src/mesk_gui.glade.h:30 
     143#: ../src/mesk_gui.glade.h:31 
    140144msgid "Queue" 
    141145msgstr "" 
    142146 
    143 #: ../src/mesk_gui.glade.h:31 
     147#: ../src/mesk_gui.glade.h:32 
    144148msgid "Queue/Unqueue" 
    145149msgstr "" 
    146150 
    147 #: ../src/mesk_gui.glade.h:32 
     151#: ../src/mesk_gui.glade.h:33 
    148152msgid "Remove" 
    149 msgstr "" 
    150  
    151 #: ../src/mesk_gui.glade.h:33 
    152 msgid "Rename..." 
    153153msgstr "" 
    154154 
     
    258258msgstr "" 
    259259 
    260 #: ../src/audio_control.py:43 
     260#: ../src/audio_control.py:44 
    261261msgid "Pause" 
    262262msgstr "" 
    263263 
    264 #: ../src/audio_control.py:120 
     264#: ../src/audio_control.py:133 
    265265#, python-format 
    266266msgid "Gstreamer version %d.%d.%d audio control initialized" 
     267msgstr "" 
     268 
     269#: ../src/audio_control.py:309 
     270#, python-format 
     271msgid "Volume %d%%" 
    267272msgstr "" 
    268273 
     
    293298msgstr "" 
    294299 
    295 #: ../src/main_window.py:73 ../src/main_window.py:394 
    296 #, python-format 
    297 msgid "Volume %d%%" 
    298 msgstr "" 
    299  
    300 #: ../src/main_window.py:110 
     300#: ../src/main_window.py:105 
    301301#, python-format 
    302302msgid "Error loading playlist '%s'" 
  • trunk/src/main_window.py

    r335 r340  
    3636 
    3737class MainWindow: 
     38    # DND_TARGETS is the targets needed by drag_source_set and drag_dest_set 
     39    DND_TARGETS = [('MESK_TAB', 0, 81)] 
     40 
    3841    def __init__(self): 
    3942        self._is_compact = False 
     
    9598 
    9699        self._pref_window = None 
     100 
     101        # Set up DnD 
     102        self._notebook.connect('drag_data_received', 
     103                               self._on_tab_drag_data_received) 
     104        self._notebook.drag_dest_set(gtk.DEST_DEFAULT_ALL, self.DND_TARGETS, 
     105                                     gtk.gdk.ACTION_MOVE) 
    97106 
    98107        # TODO: Initialize multi-media keys 
     
    176185        self._update_playlists_menu() 
    177186 
     187        # Set tab label as drag source and connect the drag_data_get signal 
     188        ctrl.tab_label_ebox.dnd_handler = \ 
     189            ctrl.tab_label_ebox.connect('drag_data_get', 
     190                                        self._on_tab_drag_data_get) 
     191        ctrl.tab_label_ebox.drag_source_set(gtk.gdk.BUTTON1_MASK, 
     192                                            self.DND_TARGETS, 
     193                                            gtk.gdk.ACTION_MOVE) 
     194 
    178195    def remove_notebook_control(self, ctrl): 
    179196        page_num = self._notebook.page_num(ctrl.widget) 
     
    203220        if self._notebook.get_n_pages() == 0: 
    204221            self.add_notebook_control(self._empty_control) 
     222        elif self._notebook.get_n_pages() == 1: 
     223            # DnD clean up 
     224            self._notebook.drag_dest_unset() 
     225 
    205226 
    206227    def _get_control_from_widget(self, widget): 
     
    249270        # Shutdown all controls 
    250271        playlists = [] 
    251         for ctrl in self._controls: 
     272        for i in range(self._notebook.get_n_pages()): 
     273            # Notebook order traversal for saving state 
     274            ctrl = self._get_control_from_widget(self._notebook.get_nth_page(i)) 
    252275            if isinstance(ctrl, PlaylistControl): 
    253276                playlists.append(ctrl.name) 
     
    426449        self.add_playlist_control(name) 
    427450 
     451    ### DnD support ### 
     452    def _on_tab_drag_data_received(self, widget, drag_context, x, y, selection, 
     453                                   type, time): 
     454        '''Reorder the tabs according to the drop position''' 
     455        source_page_num = int(selection.data) 
     456        dest_page_num, to_right = self._get_tab_at_xy(x, y) 
     457        source_child = self._notebook.get_nth_page(source_page_num) 
     458        source_tab_label = self._notebook.get_tab_label(source_child) 
     459        if dest_page_num != source_page_num: 
     460            self._notebook.reorder_child(source_child, dest_page_num) 
     461 
     462 
     463    def _on_tab_drag_data_get(self, widget, drag_context, selection, info, 
     464                              time): 
     465        source_page_num = self._find_page_num_according_to_tab_label(widget) 
     466        # 8 is the data size for the string 
     467        selection.set(selection.target, 8, str(source_page_num)) 
     468 
     469    def _find_page_num_according_to_tab_label(self, tab_label): 
     470        '''Find the page num of the tab label''' 
     471        page_num = -1 
     472        for i in xrange(self._notebook.get_n_pages()): 
     473            page = self._notebook.get_nth_page(i) 
     474            tab = self._notebook.get_tab_label(page) 
     475            if tab == tab_label: 
     476                page_num = i 
     477                break 
     478        return page_num 
     479 
     480 
     481    def _get_tab_at_xy(self, x, y): 
     482        '''Thanks to Gaim 
     483        Return the tab under xy and 
     484        if its nearer from left or right side of the tab         
     485        ''' 
     486        page_num = -1 
     487        to_right = False 
     488        horiz = self._notebook.get_tab_pos() == gtk.POS_TOP or \ 
     489                self._notebook.get_tab_pos() == gtk.POS_BOTTOM 
     490        for i in xrange(self._notebook.get_n_pages()): 
     491            page = self._notebook.get_nth_page(i) 
     492            tab = self._notebook.get_tab_label(page) 
     493            tab_alloc = tab.get_allocation() 
     494            if horiz: 
     495                if (x >= tab_alloc.x and 
     496                    (x <= (tab_alloc.x + tab_alloc.width))): 
     497                    page_num = i 
     498                    if x >= tab_alloc.x + (tab_alloc.width / 2.0): 
     499                        to_right = True 
     500                    break 
     501            else: 
     502                if (y >= tab_alloc.y and  
     503                    (y <= (tab_alloc.y + tab_alloc.height))): 
     504                    page_num = i 
     505                 
     506                    if y > tab_alloc.y + (tab_alloc.height / 2.0): 
     507                        to_right = True 
     508                    break 
     509        return (page_num, to_right) 
     510