TrackList sorting working.

This commit is contained in:
Daniel Önnerby 2008-05-21 21:11:53 +00:00
parent 1be4bd4b10
commit 747044a776
8 changed files with 98 additions and 36 deletions

View File

@ -61,10 +61,12 @@ bool Query::SortTracks::ParseQuery(Library::Base *oLibrary,db::Connection &db){
std::vector<int> sortFieldsMetakeyId;
// Create smart SQL statment
std::string selectSQL("SELECT tt.track_id FROM ");
std::string selectSQLTables("temp_track_sort tt,tracks t");
std::string selectSQLWhere(" WHERE tt.track_id=t.id ");
std::string selectSQLGroup(" GROUP BY tt.id ");
std::string selectSQL("SELECT temp_track_sort.track_id ");
std::string selectSQLTables("temp_track_sort LEFT OUTER JOIN tracks ON tracks.id=temp_track_sort.track_id ");
// std::string selectSQLWhere(" WHERE 1=1 ");
std::string selectSQLWhere(" ");
// std::string selectSQLGroup(" GROUP BY tt.id ");
std::string selectSQLGroup(" ");
std::string selectSQLSort;
std::string insertFields;
@ -78,24 +80,31 @@ bool Query::SortTracks::ParseQuery(Library::Base *oLibrary,db::Connection &db){
// Check if it's a fixed field
if(musik::core::Library::Base::IsStaticMetaKey(metakey)){
selectSQLSort += (selectSQLSort.empty()?" ORDER BY t.":",t.") + metakey;
selectSQL += ",tracks."+metakey;
selectSQLSort += (selectSQLSort.empty()?" ORDER BY tracks.":",tracks.") + metakey;
// Check if it's a special MTO field
}else if(musik::core::Library::Base::IsSpecialMTOMetaKey(metakey) || musik::core::Library::Base::IsSpecialMTMMetaKey(metakey)){
if(metakey=="album"){
selectSQLTables += ",albums al";
selectSQLWhere += "al.id=t.album_id";
selectSQLSort += (selectSQLSort.empty()?" ORDER BY al.sort_order":",al.sort_order");
selectSQLTables += " LEFT OUTER JOIN albums ON albums.id=tracks.album_id ";
// selectSQLTables += " albums al ";
// selectSQLWhere += "al.id=t.album_id";
selectSQL += ",albums.sort_order";
selectSQLSort += (selectSQLSort.empty()?" ORDER BY albums.sort_order":",albums.sort_order");
}
if(metakey=="visual_genre" || metakey=="genre"){
selectSQLTables += ",genres g";
selectSQLWhere += "g.id=t.visual_genre_id";
selectSQLSort += (selectSQLSort.empty()?" ORDER BY g.sort_order":",g.sort_order");
selectSQLTables += " LEFT OUTER JOIN genres ON genres.id=tracks.visual_genre_id ";
// selectSQLTables += ",genres g";
// selectSQLWhere += "g.id=t.visual_genre_id";
selectSQL += ",genres.sort_order";
selectSQLSort += (selectSQLSort.empty()?" ORDER BY genres.sort_order":",genres.sort_order");
}
if(metakey=="visual_artist" || metakey=="artist"){
selectSQLTables += ",artists ar";
selectSQLWhere += "ar.id=t.visual_artist_id";
selectSQLSort += (selectSQLSort.empty()?" ORDER BY ar.sort_order":",ar.sort_order");
selectSQLTables += " LEFT OUTER JOIN artists ON artists.id=tracks.visual_artist_id";
// selectSQLTables += ",artists ar";
// selectSQLWhere += "ar.id=t.visual_artist_id";
selectSQL += ",artists.sort_order";
selectSQLSort += (selectSQLSort.empty()?" ORDER BY artists.sort_order":",artists.sort_order");
}
} else {
// Sort by metakeys table
@ -105,7 +114,7 @@ bool Query::SortTracks::ParseQuery(Library::Base *oLibrary,db::Connection &db){
std::string sortField = boost::str( boost::format("ef%1%")%(sortFieldsMetakeyId.size()-1) );
selectSQLSort += (selectSQLSort.empty()?" ORDER BY tt.":",tt.")+sortField;
selectSQLSort += (selectSQLSort.empty()?" ORDER BY temp_track_sort.":",temp_track_sort.")+sortField;
createTableStatement += ","+sortField+" INTEGER";
insertFields += ","+sortField;
insertValues += ",?";
@ -120,7 +129,7 @@ bool Query::SortTracks::ParseQuery(Library::Base *oLibrary,db::Connection &db){
// First lets start by inserting all tracks in a temporary table
db.Execute("DROP TABLE IS EXISTS temp_track_sort");
db.Execute("DROP TABLE IF EXISTS temp_track_sort");
createTableStatement+=")";
db.Execute(createTableStatement.c_str());
@ -152,7 +161,7 @@ bool Query::SortTracks::ParseQuery(Library::Base *oLibrary,db::Connection &db){
}
std::string sql=selectSQL+selectSQLTables+selectSQLWhere+selectSQLGroup+selectSQLSort;
std::string sql=selectSQL+" FROM "+selectSQLTables+selectSQLWhere+selectSQLGroup+selectSQLSort;
db::Statement selectTracks(sql.c_str(),db);
while(selectTracks.Step()==db::Row){
@ -196,4 +205,7 @@ void Query::SortTracks::SortByMetaKeys(std::list<std::string> metaKeys){
this->sortMetaKeys = metaKeys;
}
void Query::SortTracks::ClearTracks(){
this->tracksToSort.clear();
}

View File

@ -68,6 +68,8 @@ namespace musik{ namespace core{
void AddTracks(std::vector<int> &tracks);
void AddTracks(musik::core::tracklist::IRandomAccess &tracks);
void ClearTracks();
void SortByMetaKeys(std::list<std::string> metaKeys);
protected:

View File

@ -40,6 +40,7 @@
#include <cube/TracklistController.hpp>
#include <cube/TracklistModel.hpp>
#include <cube/TracklistColumn.hpp>
#include <core/LibraryFactory.h>
//////////////////////////////////////////////////////////////////////////////
@ -87,6 +88,12 @@ void TracklistController::OnViewCreated(Window* window)
listView->SetModel(this->model);
listView->RowActivated.connect(this, &TracklistController::OnRowActivated);
listView->Resized.connect( this, &TracklistController::OnResized);
listView->ColumnClicked.connect( this, &TracklistController::OnColumnSort );
TracklistModel* model = (TracklistModel*)this->model.get();
if(model){
model->ConnectToQuery(&this->sortQuery);
}
}
void TracklistController::OnRowActivated(ListView* listView, int row)
@ -133,3 +140,21 @@ void TracklistController::OnResized(Window* window, Size size){
}
}
void TracklistController::OnColumnSort(ListView *listView,ColumnRef column){
TracklistColumn *tracklistColumn = (TracklistColumn*)column.get();
TracklistModel* model = (TracklistModel*)this->model.get();
if(tracklistColumn && model){
// what to sort by
std::list<std::string> sortList;
sortList.push_back(tracklistColumn->metaKey);
this->sortQuery.SortByMetaKeys(sortList);
// Add the tracks to sort
this->sortQuery.AddTracks(*(model->tracklist));
musik::core::LibraryFactory::GetCurrentLibrary()->AddQuery(this->sortQuery,musik::core::Query::CancelSimilar);
this->sortQuery.ClearTracks();
}
}

View File

@ -43,9 +43,11 @@
#include <boost/format.hpp>
#include <core/config.h>
#include <cube/TracklistView.hpp>
#include <core/Query/ListBase.h>
#include <core/tracklist/Standard.h>
#include <core/Query/SortTracks.h>
#include <cube/TracklistView.hpp>
//////////////////////////////////////////////////////////////////////////////
@ -59,24 +61,29 @@ namespace musik { namespace cube {
class TracklistController : public EventHandler
{
private: typedef ListView::ColumnRef ColumnRef;
private: typedef std::vector<ColumnRef> ColumnList;
private: typedef ListView::ModelRef ModelRef;
private:
typedef ListView::ColumnRef ColumnRef;
typedef std::vector<ColumnRef> ColumnList;
typedef ListView::ModelRef ModelRef;
public: /*ctor*/ TracklistController(
TracklistView& listView,
musik::core::Query::ListBase *connectedQuery = NULL,
musik::core::tracklist::Standard::Ptr tracklist = musik::core::tracklist::Standard::Ptr());
public:
/*ctor*/ TracklistController(
TracklistView& listView,
musik::core::Query::ListBase *connectedQuery = NULL,
musik::core::tracklist::Standard::Ptr tracklist = musik::core::tracklist::Standard::Ptr());
protected: void OnViewCreated(Window* window);
protected: void OnResized(Window* window,Size size);
protected: void OnRowActivated(ListView* listView, int row);
protected: void AddColumn(const utfchar *name, const char *metakey, int size);
private:
void OnViewCreated(Window* window);
void OnResized(Window* window,Size size);
void OnRowActivated(ListView* listView, int row);
void AddColumn(const utfchar *name, const char *metakey, int size);
void OnTracklistInfo(UINT64 tracks,UINT64 duration,UINT64 filesize);
void OnColumnSort(ListView *listView,ColumnRef column);
protected: ModelRef model;
protected: TracklistView& view;
protected: ColumnList columns;
private: void OnTracklistInfo(UINT64 tracks,UINT64 duration,UINT64 filesize);
ModelRef model;
TracklistView& view;
ColumnList columns;
musik::core::Query::SortTracks sortQuery;
};

View File

@ -68,9 +68,7 @@ using namespace musik::cube;
this->tracklist->TrackMetaUpdated.connect(this,&TracklistModel::OnTrackMeta);
this->tracklist->SetLibrary(musik::core::LibraryFactory::GetCurrentLibrary());
if(connectedQuery){
this->tracklist->ConnectToQuery(*connectedQuery);
}
this->ConnectToQuery(connectedQuery);
}
uistring TracklistModel::CellValueToString(int rowIndex, ColumnRef column)
@ -110,3 +108,9 @@ void TracklistModel::OnRowActivated(int row){
this->tracklist->SetCurrentPosition(row);
musik::core::PlaybackQueue::Instance().Play(*this->tracklist);
}
void TracklistModel::ConnectToQuery(musik::core::Query::ListBase *connectedQuery){
if(connectedQuery){
this->tracklist->ConnectToQuery(*connectedQuery);
}
}

View File

@ -63,6 +63,8 @@ public: /*ctor*/ TracklistModel(
musik::core::Query::ListBase *connectedQuery,
musik::core::tracklist::Standard::Ptr setTracklist);
public: void ConnectToQuery(musik::core::Query::ListBase *connectedQuery);
public: void OnRowActivated(int row);
// ListView::Model implementation

View File

@ -178,6 +178,13 @@ LRESULT ListView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
return 0;
}
case HDN_ITEMCLICK:
{
NMHEADER* clickHeader = reinterpret_cast<NMHEADER*>(notifyHeader);
this->ColumnClicked(this, this->ColumnIndexToColumnRef(clickHeader->iItem));
}
break;
case LVN_ITEMCHANGED: // single item has changed
case LVN_ODSTATECHANGED: // range of items has changed
{

View File

@ -114,6 +114,7 @@ public: // types
/*! */ typedef sigslot::signal2<ListView* /*sender*/, int /*row*/> RowActivatedEvent;
/*! */ typedef sigslot::signal3<ListView* /*sender*/, int /*row*/, ColumnRef> HotCellChangedEvent;
/*! */ typedef sigslot::signal1<ListView* /*sender*/> SelectionChangedEvent;
/*! */ typedef sigslot::signal2<ListView*, ColumnRef> ColumnClickedEvent;
struct RenderParams
{
@ -139,6 +140,8 @@ public: // events
HotCellChangedEvent HotCellChanged;
///\brief Emitted when the selection has changed
SelectionChangedEvent SelectionChanged;
///\brief Emitted when a Column is clicked
ColumnClickedEvent ColumnClicked;
public: // constructors
/*ctor*/ ListView();