mirror of
https://github.com/clangen/musikcube.git
synced 2025-03-14 04:18:36 +00:00
TrackList sorting working.
This commit is contained in:
parent
1be4bd4b10
commit
747044a776
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user