Functional TrackListViewQuery! We can actually see selected tracks for albums now.

This commit is contained in:
casey 2016-05-16 16:27:12 -07:00
parent c259e911db
commit 60cdbdded8
18 changed files with 219 additions and 152 deletions

View File

@ -1,41 +0,0 @@
#pragma once
#include "stdafx.h"
#include "CategoryListQuery.h"
#include <core/db/Statement.h>
using musik::core::db::Statement;
using musik::core::db::Row;
CategoryListQuery::CategoryListQuery() {
result.reset(new std::vector<std::string>());
}
CategoryListQuery::~CategoryListQuery() {
}
CategoryListQuery::Result CategoryListQuery::GetResult() {
return this->result;
}
bool CategoryListQuery::OnRun(Connection& db) {
if (result) {
result.reset(new std::vector<std::string>());
}
std::string query =
"SELECT DISTINCT albums.name "
"FROM albums, tracks "
"WHERE albums.id = tracks.album_id "
"ORDER BY albums.sort_order;";
Statement stmt(query.c_str(), db);
while (stmt.Step() == Row) {
result->push_back(stmt.ColumnText(0));
}
return true;
}

View File

@ -1,26 +0,0 @@
#pragma once
#include <core/library/query/QueryBase.h>
#include <core/db/Connection.h>
using musik::core::query::QueryBase;
using musik::core::db::Connection;
class CategoryListQuery : public QueryBase {
public:
typedef std::shared_ptr<std::vector<std::string>> Result;
CategoryListQuery();
~CategoryListQuery();
std::string Name() {
return "CategoryListQuery";
}
virtual Result GetResult();
protected:
virtual bool OnRun(Connection &db);
Result result;
};

View File

@ -5,7 +5,7 @@
#include "CategoryListView.h"
#include "SingleLineEntry.h"
#include "MultiLineEntry.h"
#include "CategoryListQuery.h"
#include "CategoryListViewQuery.h"
#include "IWindowMessage.h"
using musik::core::LibraryPtr;
@ -26,10 +26,18 @@ CategoryListView::~CategoryListView() {
}
void CategoryListView::Requery() {
this->activeQuery.reset(new CategoryListQuery());
this->activeQuery.reset(new CategoryListViewQuery());
this->library->Enqueue(activeQuery);
}
DBID CategoryListView::GetSelectedId() {
size_t index = this->GetSelectedIndex();
if (this->metadata && index < this->metadata->size()) {
return this->metadata->at(index)->id;
}
return -1;
}
void CategoryListView::OnQueryCompleted(QueryPtr query) {
if (query == this->activeQuery) {
Post(WINDOW_MESSAGE_QUERY_COMPLETED);
@ -58,7 +66,7 @@ size_t CategoryListView::Adapter::GetEntryCount() {
IScrollAdapter::EntryPtr CategoryListView::Adapter::GetEntry(size_t index) {
int64 attrs = (index == parent.GetSelectedIndex()) ? COLOR_PAIR(BOX_COLOR_BLACK_ON_GREEN) : -1;
IScrollAdapter::EntryPtr entry(new SingleLineEntry(parent.metadata->at(index)));
IScrollAdapter::EntryPtr entry(new SingleLineEntry(parent.metadata->at(index)->displayValue));
entry->SetAttrs(attrs);
return entry;
}

View File

@ -4,7 +4,7 @@
#include "ListWindow.h"
#include "ScrollAdapterBase.h"
#include "CategoryListQuery.h"
#include "CategoryListViewQuery.h"
#include <core/library/IQuery.h>
#include <core/library/ILibrary.h>
@ -15,10 +15,11 @@ using musik::core::LibraryPtr;
class CategoryListView : public ListWindow, public sigslot::has_slots<> {
public:
CategoryListView(LibraryPtr library, IWindow *parent = NULL);
~CategoryListView(); /* non-virtual for now*/
virtual ~CategoryListView();
void Requery();
virtual void ProcessMessage(IWindowMessage &message);
DBID GetSelectedId();
protected:
virtual IScrollAdapter& GetScrollAdapter();
@ -40,6 +41,6 @@ class CategoryListView : public ListWindow, public sigslot::has_slots<> {
LibraryPtr library;
Adapter *adapter;
std::shared_ptr<CategoryListQuery> activeQuery;
std::shared_ptr<std::vector<std::string>> metadata;
std::shared_ptr<CategoryListViewQuery> activeQuery;
CategoryListViewQuery::ResultList metadata;
};

View File

@ -0,0 +1,44 @@
#pragma once
#include "stdafx.h"
#include "CategoryListViewQuery.h"
#include <core/db/Statement.h>
using musik::core::db::Statement;
using musik::core::db::Row;
#define reset(x) x.reset(new std::vector<std::shared_ptr<Result>>);
CategoryListViewQuery::CategoryListViewQuery() {
reset(result);
}
CategoryListViewQuery::~CategoryListViewQuery() {
}
CategoryListViewQuery::ResultList CategoryListViewQuery::GetResult() {
return this->result;
}
bool CategoryListViewQuery::OnRun(Connection& db) {
reset(result);
std::string query =
"SELECT DISTINCT albums.id, albums.name "
"FROM albums, tracks "
"WHERE albums.id = tracks.album_id "
"ORDER BY albums.sort_order;";
Statement stmt(query.c_str(), db);
while (stmt.Step() == Row) {
std::shared_ptr<Result> row(new Result());
row->id = stmt.ColumnInt64(0);
row->displayValue = stmt.ColumnText(1);
result->push_back(row);
}
return true;
}

View File

@ -0,0 +1,33 @@
#pragma once
#include <core/library/query/QueryBase.h>
#include <core/db/Connection.h>
#include <memory>
using musik::core::query::QueryBase;
using musik::core::db::Connection;
class CategoryListViewQuery : public QueryBase {
public:
struct Result {
std::string displayValue;
DBID id;
};
typedef std::shared_ptr<std::vector<
std::shared_ptr<Result>>> ResultList;
CategoryListViewQuery();
~CategoryListViewQuery();
std::string Name() {
return "CategoryListViewQuery";
}
virtual ResultList GetResult();
protected:
virtual bool OnRun(Connection &db);
ResultList result;
};

View File

@ -5,7 +5,7 @@
#include "Screen.h"
#include "Colors.h"
#include "CategoryListQuery.h"
#include "CategoryListViewQuery.h"
#include <core/debug.h>
#include <core/sdk/IPlugin.h>
@ -132,7 +132,7 @@ void CommandWindow::Help() {
this->output->WriteLine(" pa: toggle pause/resume", s);
this->output->WriteLine(" st: stop playing", s);
//this->output->WriteLine(" ls: list currently playing", s);
this->output->WriteLine(" lp: list loaded plugins", s);
this->output->WriteLine(" plugins: list loaded plugins", s);
this->output->WriteLine(" v: <0 - 100>: set % volume", s);
this->output->WriteLine(" sk <seconds>: seek to <seconds> into track", s);
this->output->WriteLine(" addir <dir>: add a directory to be indexed", s);

View File

@ -33,11 +33,23 @@ void LibraryLayout::InitializeWindows() {
this->AddWindow(this->albumList);
this->AddWindow(this->trackList);
this->albumList->SelectionChanged.connect(
this, &LibraryLayout::OnCategoryViewSelectionChanged);
this->Layout();
}
void LibraryLayout::Show() {
LayoutBase::Show();
this->trackList->Requery();
this->albumList->Requery();
}
void LibraryLayout::OnCategoryViewSelectionChanged(
ListWindow *view, size_t newIndex, size_t oldIndex) {
if (view == this->albumList.get()) {
DBID id = this->albumList->GetSelectedId();
if (id != -1) {
this->trackList->Requery("album_id", id);
}
}
}

View File

@ -6,9 +6,11 @@
#include <core/library/ILibrary.h>
#include <sigslot/sigslot.h>
using musik::core::LibraryPtr;
class LibraryLayout : public LayoutBase {
class LibraryLayout : public LayoutBase, public sigslot::has_slots<> {
public:
LibraryLayout(LibraryPtr library);
virtual ~LibraryLayout();
@ -19,6 +21,9 @@ class LibraryLayout : public LayoutBase {
private:
void InitializeWindows();
void OnCategoryViewSelectionChanged(
ListWindow *view, size_t newIndex, size_t oldIndex);
LibraryPtr library;
std::shared_ptr<CategoryListView> albumList;
std::shared_ptr<TrackListView> trackList;

View File

@ -110,11 +110,16 @@ void ListWindow::PageDown() {
this->Repaint();
}
void ListWindow::OnSelectionChanged(size_t newIndex, size_t oldIndex) {
/* for subclass use */
}
void ListWindow::SetSelectedIndex(size_t index) {
if (this->selectedIndex != index) {
size_t prev = this->selectedIndex;
this->selectedIndex = index;
this->SelectionChanged(this, index, prev);
this->OnSelectionChanged(index, prev); /* internal */
this->SelectionChanged(this, index, prev); /* external */
}
}

View File

@ -25,6 +25,7 @@ class ListWindow : public ScrollableWindow {
protected:
virtual void SetSelectedIndex(size_t index);
virtual void OnAdapterChanged();
virtual void OnSelectionChanged(size_t newIndex, size_t oldIndex);
virtual IScrollAdapter::ScrollPosition& GetScrollPosition();
private:

View File

@ -7,6 +7,8 @@
#include "IWindowMessage.h"
#include <boost/format.hpp>
#include <boost/format/group.hpp>
#include <iomanip>
#define WINDOW_MESSAGE_QUERY_COMPLETED 1002
@ -24,8 +26,8 @@ TrackListView::~TrackListView() {
}
void TrackListView::Requery() {
this->query.reset(new TracklistQuery());
void TrackListView::Requery(const std::string& column, DBID id) {
this->query.reset(new TrackListViewQuery(this->library, column, id));
this->library->Enqueue(this->query);
}
@ -54,13 +56,23 @@ TrackListView::Adapter::Adapter(TrackListView &parent)
}
size_t TrackListView::Adapter::GetEntryCount() {
return 23847;//parent.metadata ? parent.metadata->size() : 0;
return parent.metadata ? parent.metadata->size() : 0;
}
IScrollAdapter::EntryPtr TrackListView::Adapter::GetEntry(size_t index) {
int64 attrs = (index == parent.GetSelectedIndex()) ? COLOR_PAIR(BOX_COLOR_BLACK_ON_GREEN) : -1;
std::string text = boost::str(boost::format("%1% %2%") % index % "need to fill in the metadata");
IScrollAdapter::EntryPtr entry(new SingleLineEntry(/*parent.metadata->at(index)*/ text));
TrackPtr track = parent.metadata->at(index);
std::string trackNum = track->GetValue("track");
std::string title = track->GetValue("title");
std::string text = boost::str(
boost::format("%s %s")
% boost::io::group(std::setw(3), std::setfill(' '), trackNum)
% title);
IScrollAdapter::EntryPtr entry(new SingleLineEntry(text));
entry->SetAttrs(attrs);
return entry;

View File

@ -3,7 +3,7 @@
#include "curses_config.h"
#include "ListWindow.h"
#include "TracklistQuery.h"
#include "TrackListViewQuery.h"
#include "ScrollAdapterBase.h"
#include <core/library/ILibrary.h>
@ -17,7 +17,7 @@ class TrackListView : public ListWindow, public sigslot::has_slots<> {
~TrackListView();
virtual void ProcessMessage(IWindowMessage &message);
void Requery();
void Requery(const std::string& column, DBID id);
protected:
virtual IScrollAdapter& GetScrollAdapter();
@ -36,7 +36,7 @@ class TrackListView : public ListWindow, public sigslot::has_slots<> {
};
private:
std::shared_ptr<TracklistQuery> query;
std::shared_ptr<TrackListViewQuery> query;
std::shared_ptr<std::vector<TrackPtr>> metadata;
Adapter* adapter;
LibraryPtr library;

View File

@ -0,0 +1,53 @@
#pragma once
#include "stdafx.h"
#include "TrackListViewQuery.h"
#include <core/library/track/LibraryTrack.h>
#include <core/db/Statement.h>
using musik::core::db::Statement;
using musik::core::db::Row;
using musik::core::TrackPtr;
using musik::core::LibraryTrack;
TrackListViewQuery::TrackListViewQuery(LibraryPtr library, const std::string& column, DBID id) {
this->library = library;
this->column = column;
this->id = id;
this->result.reset(new std::vector<TrackPtr>());
}
TrackListViewQuery::~TrackListViewQuery() {
}
TrackListViewQuery::Result TrackListViewQuery::GetResult() {
return this->result;
}
bool TrackListViewQuery::OnRun(Connection& db) {
if (result) {
result.reset(new std::vector<TrackPtr>());
}
std::string query = boost::str(
boost::format(
"SELECT DISTINCT tracks.id, tracks.track, tracks.title "
"FROM tracks "
"WHERE %1%=? "
"ORDER BY tracks.track;") % this->column);
Statement stmt(query.c_str(), db);
stmt.BindInt(0, this->id);
while (stmt.Step() == Row) {
DBID id = stmt.ColumnInt64(0);
TrackPtr track = TrackPtr(new LibraryTrack(id, this->library));
track->SetValue("track", boost::lexical_cast<std::string>(stmt.ColumnInt(1)).c_str());
track->SetValue("title", stmt.ColumnText(2));
result->push_back(track);
}
return true;
}

View File

@ -3,22 +3,22 @@
#include <core/library/query/QueryBase.h>
#include <core/db/Connection.h>
#include <core/library/track/Track.h>
#include "CategoryListQuery.h"
#include "CategoryListViewQuery.h"
using musik::core::query::QueryBase;
using musik::core::db::Connection;
using musik::core::TrackPtr;
using musik::core::LibraryPtr;
class TracklistQuery : public QueryBase {
class TrackListViewQuery : public QueryBase {
public:
typedef std::shared_ptr<std::vector<TrackPtr>> Result;
typedef std::shared_ptr<CategoryListQuery> Category;
TracklistQuery();
~TracklistQuery();
TrackListViewQuery(LibraryPtr library, const std::string& column, DBID id);
~TrackListViewQuery();
std::string Name() {
return "TracklistQuery";
return "TrackListViewQuery";
}
virtual Result GetResult();
@ -29,6 +29,7 @@ class TracklistQuery : public QueryBase {
Result result;
private:
std::vector<Category> categories;
LibraryPtr library;
std::string column;
DBID id;
};

View File

@ -1,41 +0,0 @@
#pragma once
#include "stdafx.h"
#include "TracklistQuery.h"
#include <core/db/Statement.h>
using musik::core::db::Statement;
using musik::core::db::Row;
using musik::core::TrackPtr;
TracklistQuery::TracklistQuery() {
result.reset(new std::vector<TrackPtr>());
}
TracklistQuery::~TracklistQuery() {
}
TracklistQuery::Result TracklistQuery::GetResult() {
return this->result;
}
bool TracklistQuery::OnRun(Connection& db) {
if (result) {
result.reset(new std::vector<TrackPtr>());
}
std::string query =
"SELECT DISTINCT track.name "
"FROM tracks "
"ORDER BY track.name;";
Statement stmt(query.c_str(), db);
while (stmt.Step() == Row) {
//result->push_back(stmt.ColumnText(0));
}
return true;
}

View File

@ -115,7 +115,7 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="CategoryListQuery.cpp" />
<ClCompile Include="CategoryListViewQuery.cpp" />
<ClCompile Include="CategoryListView.cpp" />
<ClCompile Include="LayoutBase.cpp" />
<ClCompile Include="ListWindow.cpp" />
@ -125,7 +125,7 @@
<ClCompile Include="MultiLineEntry.cpp" />
<ClCompile Include="ScrollableWindow.cpp" />
<ClCompile Include="SingleLineEntry.cpp" />
<ClCompile Include="TracklistQuery.cpp" />
<ClCompile Include="TrackListViewQuery.cpp" />
<ClCompile Include="TrackListView.cpp" />
<ClCompile Include="Window.cpp" />
<ClCompile Include="Colors.cpp" />
@ -148,7 +148,7 @@
<ClCompile Include="WindowMessageQueue.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="CategoryListQuery.h" />
<ClInclude Include="CategoryListViewQuery.h" />
<ClInclude Include="CategoryListView.h" />
<ClInclude Include="IDisplayable.h" />
<ClInclude Include="IWindowGroup.h" />
@ -162,7 +162,7 @@
<ClInclude Include="ScrollableWindow.h" />
<ClInclude Include="ListWindow.h" />
<ClInclude Include="SingleLineEntry.h" />
<ClInclude Include="TracklistQuery.h" />
<ClInclude Include="TrackListViewQuery.h" />
<ClInclude Include="TrackListView.h" />
<ClInclude Include="Window.h" />
<ClInclude Include="Colors.h" />

View File

@ -39,9 +39,6 @@
<ClCompile Include="Window.cpp">
<Filter>curses</Filter>
</ClCompile>
<ClCompile Include="CategoryListQuery.cpp">
<Filter>query</Filter>
</ClCompile>
<ClCompile Include="MainLayout.cpp">
<Filter>view</Filter>
</ClCompile>
@ -72,15 +69,18 @@
<ClCompile Include="LayoutBase.cpp">
<Filter>curses</Filter>
</ClCompile>
<ClCompile Include="TracklistQuery.cpp">
<Filter>query</Filter>
</ClCompile>
<ClCompile Include="WindowMessage.cpp">
<Filter>curses</Filter>
</ClCompile>
<ClCompile Include="WindowMessageQueue.cpp">
<Filter>curses</Filter>
</ClCompile>
<ClCompile Include="TrackListViewQuery.cpp">
<Filter>query</Filter>
</ClCompile>
<ClCompile Include="CategoryListViewQuery.cpp">
<Filter>query</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h" />
@ -123,9 +123,6 @@
<ClInclude Include="Window.h">
<Filter>curses</Filter>
</ClInclude>
<ClInclude Include="CategoryListQuery.h">
<Filter>query</Filter>
</ClInclude>
<ClInclude Include="MainLayout.h">
<Filter>view</Filter>
</ClInclude>
@ -165,9 +162,6 @@
<ClInclude Include="IDisplayable.h">
<Filter>curses</Filter>
</ClInclude>
<ClInclude Include="TracklistQuery.h">
<Filter>query</Filter>
</ClInclude>
<ClInclude Include="IWindowMessage.h">
<Filter>curses</Filter>
</ClInclude>
@ -177,6 +171,12 @@
<ClInclude Include="WindowMessageQueue.h">
<Filter>curses</Filter>
</ClInclude>
<ClInclude Include="TrackListViewQuery.h">
<Filter>query</Filter>
</ClInclude>
<ClInclude Include="CategoryListViewQuery.h">
<Filter>query</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="curses">