2014-01-20 19:06:52 -05:00
|
|
|
/*
|
|
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
|
|
*
|
|
|
|
* See the example at:
|
|
|
|
* https://git.gnome.org/browse/gtkmm-documentation/tree/examples/others/treemodelcustom
|
|
|
|
*/
|
2014-06-05 10:19:22 -04:00
|
|
|
#include <core/audio.h>
|
2014-06-29 10:47:59 -04:00
|
|
|
#include <lib/model.h>
|
2014-02-01 16:44:01 -05:00
|
|
|
#include <stdlib.h>
|
2014-01-20 19:06:52 -05:00
|
|
|
|
2014-01-26 17:40:46 -05:00
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
QueueModel::QueueModel(Queue *q)
|
|
|
|
: Glib::ObjectBase( typeid(QueueModel) ),
|
2015-01-13 20:33:52 -05:00
|
|
|
Glib::Object(), _stamp(1), _queue(q)
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2014-02-01 16:44:01 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
void QueueModel::increment_stamp()
|
2014-02-01 16:44:01 -05:00
|
|
|
{
|
2015-01-13 20:33:52 -05:00
|
|
|
if (++_stamp == 0)
|
|
|
|
++_stamp;
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2015-01-13 20:06:24 -05:00
|
|
|
bool QueueModel::check_iter_validity(const Gtk::TreeIter &iter) const
|
|
|
|
{
|
2015-01-13 20:33:52 -05:00
|
|
|
return _stamp == iter.get_stamp();
|
2015-01-13 20:06:24 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
void QueueModel::on_row_inserted(unsigned int row)
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2014-02-01 16:44:01 -05:00
|
|
|
increment_stamp();
|
2015-01-13 20:14:44 -05:00
|
|
|
row_inserted(Gtk::TreePath(1, row), Gtk::TreeIter());
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
void QueueModel::on_row_deleted(unsigned int row)
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2014-02-01 16:44:01 -05:00
|
|
|
increment_stamp();
|
2015-01-13 20:14:44 -05:00
|
|
|
row_deleted(Gtk::TreePath(1, row));
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
void QueueModel::on_row_changed(unsigned int row)
|
2014-01-26 13:45:59 -05:00
|
|
|
{
|
2014-02-01 16:44:01 -05:00
|
|
|
increment_stamp();
|
2015-01-13 20:14:44 -05:00
|
|
|
row_changed(Gtk::TreePath(1, row), Gtk::TreeIter());
|
2014-01-26 13:45:59 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
void QueueModel::on_path_selected(const Gtk::TreePath &path)
|
2014-01-26 12:44:48 -05:00
|
|
|
{
|
2014-12-02 08:16:22 -05:00
|
|
|
audio :: load_track(tags :: get_track(path_to_id(path)));
|
2015-01-13 20:33:52 -05:00
|
|
|
_queue->track_selected(path[0]);
|
2014-01-26 12:44:48 -05:00
|
|
|
audio :: play();
|
|
|
|
}
|
|
|
|
|
2015-01-13 19:09:40 -05:00
|
|
|
unsigned int QueueModel :: iter_to_id(const Gtk::TreeIter &iter) const
|
2014-02-01 17:30:07 -05:00
|
|
|
{
|
|
|
|
return GPOINTER_TO_UINT(iter.gobj()->user_data);
|
|
|
|
}
|
|
|
|
|
2015-01-13 19:09:40 -05:00
|
|
|
unsigned int QueueModel::path_to_id(const Gtk::TreePath &path) const
|
2014-02-02 10:45:09 -05:00
|
|
|
{
|
2015-01-13 20:33:52 -05:00
|
|
|
return _queue->operator[](path[0])->index();
|
2014-02-02 10:45:09 -05:00
|
|
|
}
|
|
|
|
|
2014-01-20 19:06:52 -05:00
|
|
|
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
Gtk::TreeModelFlags QueueModel::get_flags_vfunc() const
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
|
|
|
return Gtk::TREE_MODEL_LIST_ONLY;
|
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
int QueueModel::get_n_columns_vfunc() const
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2014-01-29 22:23:07 -05:00
|
|
|
return 10;
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
GType QueueModel::get_column_type_vfunc(int index) const
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2015-01-13 19:53:36 -05:00
|
|
|
if (index > 9)
|
2014-01-20 19:06:52 -05:00
|
|
|
return 0;
|
2015-01-13 19:53:36 -05:00
|
|
|
if (index == 0 || index == 5 || index == 7)
|
|
|
|
return G_TYPE_UINT;
|
|
|
|
return G_TYPE_STRING;
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2015-01-13 19:53:36 -05:00
|
|
|
template <class T>
|
|
|
|
static void set_val(const T &t, Glib::ValueBase &value)
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2015-01-13 19:53:36 -05:00
|
|
|
Glib::Value<T> specific;
|
|
|
|
specific.init(Glib::Value<T>::value_type());
|
|
|
|
specific.set(t);
|
|
|
|
value.init(specific.gobj());
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
void QueueModel::get_value_vfunc(const Gtk::TreeIter &iter, int column,
|
2014-01-20 19:06:52 -05:00
|
|
|
Glib::ValueBase &value) const
|
|
|
|
{
|
2014-03-29 11:44:39 -04:00
|
|
|
Track *track;
|
2014-01-20 19:06:52 -05:00
|
|
|
|
2015-01-13 19:53:36 -05:00
|
|
|
if (!check_iter_validity(iter) ||
|
|
|
|
column > get_n_columns_vfunc())
|
2014-01-20 19:06:52 -05:00
|
|
|
return;
|
|
|
|
|
2015-01-13 20:33:52 -05:00
|
|
|
track = _queue->operator[](iter_to_id(iter));
|
2014-01-20 19:06:52 -05:00
|
|
|
|
|
|
|
switch (column) {
|
|
|
|
case 0:
|
2015-01-13 19:53:36 -05:00
|
|
|
return set_val(track->track(), value);
|
|
|
|
case 1:
|
|
|
|
return set_val(track->name(), value);
|
|
|
|
case 2:
|
|
|
|
return set_val(track->length_str(), value);
|
|
|
|
case 3:
|
|
|
|
return set_val(track->artist()->name(), value);
|
|
|
|
case 4:
|
|
|
|
return set_val(track->album()->name(), value);
|
2014-01-20 19:06:52 -05:00
|
|
|
case 5:
|
2015-01-13 19:53:36 -05:00
|
|
|
return set_val(track->album()->year(), value);
|
|
|
|
case 6:
|
|
|
|
return set_val(track->genre()->name(), value);
|
2014-01-20 19:06:52 -05:00
|
|
|
case 7:
|
2015-01-13 19:53:36 -05:00
|
|
|
return set_val(track->count(), value);
|
|
|
|
case 8:
|
|
|
|
return set_val(track->date(), value);
|
|
|
|
case 9:
|
|
|
|
return set_val(Glib::Markup::escape_text(track->path()), value);
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
bool QueueModel::iter_next_vfunc(const Gtk::TreeIter &iter,
|
2015-01-13 20:06:24 -05:00
|
|
|
Gtk::TreeIter &next) const
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2015-01-13 20:06:24 -05:00
|
|
|
next = Gtk::TreeIter();
|
|
|
|
if (check_iter_validity(iter))
|
|
|
|
return iter_nth_root_child_vfunc(iter_to_id(iter) + 1, next);
|
|
|
|
return false;
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
int QueueModel::iter_n_root_children_vfunc() const
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2015-01-13 20:33:52 -05:00
|
|
|
return _queue->size();
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
bool QueueModel::iter_nth_root_child_vfunc(int n, Gtk::TreeIter &iter) const
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
|
|
|
iter = Gtk::TreeIter();
|
2015-01-13 20:33:52 -05:00
|
|
|
if (n >= (int)_queue->size())
|
2014-02-01 16:44:01 -05:00
|
|
|
return false;
|
|
|
|
|
2015-01-13 20:33:52 -05:00
|
|
|
iter.set_stamp(_stamp);
|
2014-02-01 16:44:01 -05:00
|
|
|
iter.gobj()->user_data = GUINT_TO_POINTER(n);
|
|
|
|
return true;
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
Gtk::TreeModel::Path QueueModel::get_path_vfunc(const Gtk::TreeIter &iter) const
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
|
|
|
Gtk::TreeModel::Path path;
|
|
|
|
if (check_iter_validity(iter))
|
2015-01-13 19:09:40 -05:00
|
|
|
path.push_back(iter_to_id(iter));
|
2014-01-20 19:06:52 -05:00
|
|
|
return path;
|
|
|
|
}
|
|
|
|
|
2014-04-01 20:28:19 -04:00
|
|
|
bool QueueModel::get_iter_vfunc(const Gtk::TreePath &path,
|
2014-02-01 16:44:01 -05:00
|
|
|
Gtk::TreeIter &iter) const
|
2014-01-20 19:06:52 -05:00
|
|
|
{
|
2015-01-13 20:06:24 -05:00
|
|
|
iter = Gtk::TreeIter();
|
|
|
|
if (path.size() == 1)
|
|
|
|
return iter_nth_root_child_vfunc(path[0], iter);
|
|
|
|
return false;
|
2014-01-20 19:06:52 -05:00
|
|
|
}
|