Changeset e33fc286262f

Show
Ignore:
Timestamp:
11/18/08 01:39:05 (7 weeks ago)
Author:
milosz2@…
Branch:
trunk
Message:

* Add option to refresh shoutcast list during runtime, and also some code cleanups in the radio source generally and in shoutcast/icecast components

Files:
6 modified

Legend:

Unmodified
Added
Removed
  • com/view-albums.cc

    r969 r1016  
    395395                        AlbumsTreeStore->set_sort_column(0, Gtk::SORT_ASCENDING); 
    396396 
    397                         m_DiscDefault_Pixbuf = 
    398                                 Gdk::Pixbuf::create_from_file( 
    399                                                 build_filename( 
    400                                                         DATA_DIR, 
    401                                                         build_filename("images","disc.png") 
    402                                                         ) 
    403                                                 )->scale_simple(90,90,Gdk::INTERP_BILINEAR); 
    404  
    405                         m_DiscDefault = Util::cairo_image_surface_from_pixbuf(m_DiscDefault_Pixbuf->scale_simple(90,90,Gdk::INTERP_BILINEAR)); 
     397                        m_DiscDefault_DND = IconTheme::get_default()->load_icon("gnome-dev-cdrom-audio", 128); 
     398                        m_DiscDefault = Util::cairo_image_surface_from_pixbuf(m_DiscDefault_DND->scale_simple(90,90,Gdk::INTERP_BILINEAR)); 
    406399 
    407400                        std::vector<TargetEntry> Entries; 
     
    565558                                        } 
    566559 
    567                                         drag_source_set_icon(m_DiscDefault_Pixbuf->scale_simple(128,128,Gdk::INTERP_BILINEAR)); 
     560                                        drag_source_set_icon(m_DiscDefault_DND->scale_simple(128,128,Gdk::INTERP_BILINEAR)); 
    568561                                } 
    569562                                else 
  • include/mpx/com/view-albums.hh

    r963 r1016  
    218218 
    219219                            Cairo::RefPtr<Cairo::ImageSurface>    m_DiscDefault; 
    220                             Glib::RefPtr<Gdk::Pixbuf>             m_DiscDefault_Pixbuf; 
     220                            Glib::RefPtr<Gdk::Pixbuf>             m_DiscDefault_DND; 
    221221                            Glib::RefPtr<Gdk::Pixbuf>             m_Emblem[N_EMS]; 
    222222                            Glib::RefPtr<Gdk::Pixbuf>             m_Stars[N_STARS]; 
  • sources/radio/source-radio.cc

    r954 r1016  
    5050using namespace Gtk; 
    5151 
    52 #define RADIO_ACTION_UPDATE_LIST    "radio-action-update-list" 
    53  
    5452namespace 
    5553{ 
    56   enum Page 
    57   { 
    58     PAGE_SHOUTCAST, 
    59     PAGE_ICECAST, 
    60   }; 
     54    enum Page 
     55    { 
     56      PAGE_SHOUTCAST, 
     57      PAGE_ICECAST, 
     58    }; 
     59 
     60    const char RADIO_ACTION_UPDATE_XIPH[] = "radio-action-update-xiph"; 
     61    const char RADIO_ACTION_UPDATE_SHOUT[] = "radio-action-update-shout"; 
     62 
    6163 
    6264    char const * ui_source = 
     
    6668    "   <placeholder name='placeholder-source'>" 
    6769    "     <menu action='menu-source-radio'>" 
    68     "         <menuitem action='radio-action-update-list'/>" 
     70    "         <menuitem action='radio-action-update-xiph'/>" 
     71    "         <menuitem action='radio-action-update-shout'/>" 
    6972    "     </menu>" 
    7073    "   </placeholder>" 
     
    163166 
    164167                m_ui_manager = ui_manager;  
     168 
    165169                m_actions = ActionGroup::create ("Actions_Radio"); 
    166                 m_actions->add (Action::create ("menu-source-radio", _("Radio"))); 
    167  
    168                 m_actions->add  (Action::create (RADIO_ACTION_UPDATE_LIST, 
    169                                                                                   Gtk::Stock::REFRESH, 
    170                                                                                   _("Update Icecast List")), 
    171                                                                                   (sigc::mem_fun (*this, &Radio::on_update_list))); 
     170 
     171                m_actions->add (Action::create( 
     172                            "menu-source-radio", 
     173                            _("Radio") 
     174        )); 
     175 
     176                m_actions->add (Action::create( 
     177                            RADIO_ACTION_UPDATE_XIPH, 
     178                                                        Gtk::Stock::REFRESH, 
     179                                                        _("Icecast: Update List")), 
     180                                                        sigc::mem_fun( 
     181                                *m_icecast_list, 
     182                                &RadioDirectory::Icecast::refresh 
     183        )); 
     184 
     185                m_actions->add (Action::create( 
     186                            RADIO_ACTION_UPDATE_SHOUT, 
     187                                                        Gtk::Stock::REFRESH, 
     188                                                        _("SHOUTcast: Update List")), 
     189                                                        sigc::mem_fun( 
     190                                *m_shoutcast_base, 
     191                                &RadioDirectory::Shoutcast::refresh 
     192        )); 
     193 
    172194 
    173195                m_ui_manager->insert_action_group (m_actions); 
     
    209231                          m_Caps = Caps (m_Caps & ~C_CAN_PLAY); 
    210232                Signals.Caps.emit (m_Caps); 
    211     } 
    212  
    213     void 
    214     Radio::on_update_list () 
    215     { 
    216                 if( m_notebook_radio->get_current_page() == 1) 
    217                 { 
    218                   m_notebook_icecast->set_current_page(1); 
    219                   m_icecast_list->refresh(); 
    220                 } 
    221233    } 
    222234 
  • sources/radio/source-radio.hh

    r839 r1016  
    9494 
    9595        void 
    96         on_update_list (); 
    97  
    98         void 
    9996        on_set_notebook_page (); 
    10097 
  • sources/radio/streams-shoutcast.cc

    r811 r1016  
    6363      { 
    6464        Data.Cache = g_hash_table_new_full (g_str_hash,g_str_equal,GDestroyNotify(g_free),GDestroyNotify(xmlFreeDoc)); 
    65         build_genre_list (); 
    66       } 
    67  
    68       Shoutcast::~Shoutcast () 
    69       { 
    70         g_hash_table_destroy (Data.Cache); 
    71       } 
    72  
    73       SignalListUpdated& 
    74       Shoutcast::signal_list_updated () 
    75       { 
    76         return Signals.ListUpdated; 
    77       } 
    78  
    79       SignalStartStop& 
    80       Shoutcast::signal_start () 
    81       { 
    82         return Signals.Start; 
    83       } 
    84  
    85       SignalStartStop& 
    86       Shoutcast::signal_stop () 
    87       { 
    88         return Signals.Stop; 
    89       } 
    90  
    91       void 
    92       Shoutcast::genre_cell_data_func (CellRenderer                *cell, 
    93                                        TreeModel::iterator const&   iter) 
    94       { 
    95         CellRendererText *cell_text = reinterpret_cast<CellRendererText *>(cell); 
    96         ustring genre = (*iter)[columns.name]; 
    97  
    98         if (g_hash_table_lookup (Data.Cache, genre.c_str())) 
    99             cell_text->property_markup () = ((boost::format ("<b>%s</b>")) % std::string(Markup::escape_text(genre))).str(); 
    100         else 
    101             cell_text->property_markup () = Markup::escape_text (genre); 
    102       } 
    103  
    104       void 
    105       Shoutcast::build_genre_list () 
    106       { 
    107         xmlDocPtr             doc; 
    108         xmlXPathObjectPtr     xpathobj; 
    109         xmlNodeSetPtr         nv; 
    110  
    111         MPX::URI u ((boost::format ("http://%s/%s") % SHOUTCAST_HOST % SHOUTCAST_PATH).str()); 
    112         Soup::RequestSyncRefP request = Soup::RequestSync::create (ustring (u)); 
    113         guint code = request->run (); 
    114         if (code != 200) return; 
    115  
    116         std::string data = request->get_data();  
    117         doc = xmlParseMemory ((const char*)(data.c_str()), data.size()); 
    118         if (!doc) return; 
    119  
    120         xpathobj = xpath_query (doc, BAD_CAST "//genre", NULL); 
    121         nv = xpathobj->nodesetval; 
    12265 
    12366        CellRendererText *cell; 
     
    12669        get_column (0)->set_resizable (false); 
    12770        get_column (0)->set_sizing (TREE_VIEW_COLUMN_AUTOSIZE); 
    128  
    12971        Data.Genres = ListStore::create (columns); 
     72        set_model (Data.Genres); 
     73        get_column (0)->set_cell_data_func (*cell, sigc::mem_fun (this, &MPX::RadioDirectory::Shoutcast::Shoutcast::genre_cell_data_func)); 
     74        get_selection()->set_mode (SELECTION_BROWSE); 
     75        get_selection()->signal_changed().connect (sigc::mem_fun (this, &MPX::RadioDirectory::Shoutcast::Shoutcast::refresh_wrapper)); 
     76 
     77        refresh (); 
     78      } 
     79 
     80      Shoutcast::~Shoutcast () 
     81      { 
     82        g_hash_table_destroy (Data.Cache); 
     83      } 
     84 
     85      SignalListUpdated& 
     86      Shoutcast::signal_list_updated () 
     87      { 
     88        return Signals.ListUpdated; 
     89      } 
     90 
     91      SignalStartStop& 
     92      Shoutcast::signal_start () 
     93      { 
     94        return Signals.Start; 
     95      } 
     96 
     97      SignalStartStop& 
     98      Shoutcast::signal_stop () 
     99      { 
     100        return Signals.Stop; 
     101      } 
     102 
     103      void 
     104      Shoutcast::genre_cell_data_func (CellRenderer                *cell, 
     105                                       TreeModel::iterator const&   iter) 
     106      { 
     107        CellRendererText *cell_text = reinterpret_cast<CellRendererText *>(cell); 
     108        ustring genre = (*iter)[columns.name]; 
     109 
     110        if (g_hash_table_lookup (Data.Cache, genre.c_str())) 
     111            cell_text->property_markup () = ((boost::format ("<b>%s</b>")) % std::string(Markup::escape_text(genre))).str(); 
     112        else 
     113            cell_text->property_markup () = Markup::escape_text (genre); 
     114      } 
     115 
     116      void 
     117      Shoutcast::refresh () 
     118      { 
     119        xmlDocPtr             doc; 
     120        xmlXPathObjectPtr     xpathobj; 
     121        xmlNodeSetPtr         nv; 
     122 
     123        MPX::URI u ((boost::format ("http://%s/%s") % SHOUTCAST_HOST % SHOUTCAST_PATH).str()); 
     124        Soup::RequestSyncRefP request = Soup::RequestSync::create (ustring (u)); 
     125        guint code = request->run (); 
     126        if (code != 200) return; 
     127 
     128        std::string data = request->get_data();  
     129        doc = xmlParseMemory ((const char*)(data.c_str()), data.size()); 
     130        if (!doc) return; 
     131 
     132        xpathobj = xpath_query (doc, BAD_CAST "//genre", NULL); 
     133        nv = xpathobj->nodesetval; 
     134 
     135        Data.Genres->clear(); 
    130136        (*Data.Genres->append())[columns.name] = "Top500"; 
    131137        (*Data.Genres->append())[columns.name] = _(CUSTOM_SEARCH); 
     
    136142          g_free (prop); 
    137143        } 
    138  
    139         set_model (Data.Genres); 
    140  
    141         get_column (0)->set_cell_data_func (*cell, sigc::mem_fun (this, &MPX::RadioDirectory::Shoutcast::Shoutcast::genre_cell_data_func)); 
    142         get_selection()->set_mode (SELECTION_BROWSE); 
    143         get_selection()->signal_changed().connect (sigc::mem_fun (this, &MPX::RadioDirectory::Shoutcast::Shoutcast::refresh_wrapper)); 
    144144 
    145145        xmlXPathFreeObject (xpathobj); 
     
    159159          { 
    160160            Data.CurrentIter = iter;  
    161             refresh (0); // FIXME: Use an enum here that says something 
     161            rebuild_list(false);  
    162162          } 
    163163          else 
     
    263263 
    264264      void 
    265       Shoutcast::refresh (bool force) 
     265      Shoutcast::rebuild_list (bool force) 
    266266      { 
    267267        if (!get_selection()->count_selected_rows()) 
     
    299299        if (g_hash_table_lookup (Data.Cache, genre.c_str())) 
    300300        { 
    301           refresh (1); 
     301          rebuild_list(true); 
    302302        } 
    303303      } 
  • sources/radio/streams-shoutcast.hh

    r997 r1016  
    7272        virtual ~Shoutcast (); 
    7373 
    74         void refresh (bool force = false); 
     74        void  refresh (); 
    7575 
    7676        SignalListUpdated& 
     
    9292 
    9393        void  genre_cell_data_func (Gtk::CellRenderer *cell, Gtk::TreeIter const& iter); 
    94         void  build_genre_list (); 
    9594        void  refresh_wrapper (); 
    9695        void  refresh_parse_and_emit_updated (xmlDocPtr doc); 
    9796        void  refresh_callback (char const* data, guint size, guint code, std::string const& genre); 
     97        void  rebuild_list (bool force = false); 
    9898 
    9999        struct DataT