made the rows in the Live Mode window drag'n'drop reorderable
This commit is contained in:
parent
bbcc7bf2ca
commit
e21440dff2
4 changed files with 111 additions and 34 deletions
|
@ -143,6 +143,15 @@ class ZebraTreeView : public Gtk::TreeView
|
||||||
signalCellEdited().emit(path, columnId, newText);
|
signalCellEdited().emit(path, columnId, newText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renumber the rows after they have changed.
|
||||||
|
*
|
||||||
|
* This is called from the onRowInserted(), onRowDeleted() and
|
||||||
|
* onRowsReordered() signal handlers.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
renumberRows(void) throw ();
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -154,6 +163,42 @@ class ZebraTreeView : public Gtk::TreeView
|
||||||
int,
|
int,
|
||||||
const Glib::ustring &> signalCellEditedObject;
|
const Glib::ustring &> signalCellEditedObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler for the row_inserted signal.
|
||||||
|
*
|
||||||
|
* @param path a path pointing to the inserted row.
|
||||||
|
* @param iter an iterator pointing to the inserted row.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
onRowInserted(const Gtk::TreeModel::Path & path,
|
||||||
|
const Gtk::TreeModel::iterator & iter)
|
||||||
|
throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler for the row_deleted signal.
|
||||||
|
*
|
||||||
|
* @param path points to the previous location of the deleted row.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
onRowDeleted(const Gtk::TreeModel::Path & path) throw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler for the rows_reordered signal.
|
||||||
|
*
|
||||||
|
* @param path points to the tree node whose children have been
|
||||||
|
* reordered.
|
||||||
|
* @param iter points to the node whose children have been
|
||||||
|
* reordered, or 0 if the depth of path is 0.
|
||||||
|
* @param mapping an array of integers mapping the current position
|
||||||
|
* of each child to its old position before the
|
||||||
|
* re-ordering, i.e. mapping[newpos] = oldpos.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
onRowsReordered(const Gtk::TreeModel::Path & path,
|
||||||
|
const Gtk::TreeModel::iterator& iter,
|
||||||
|
int* mapping)
|
||||||
|
throw ();
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -62,6 +62,12 @@ ZebraTreeView :: ZebraTreeView(Glib::RefPtr<Gtk::TreeModel> treeModel)
|
||||||
throw ()
|
throw ()
|
||||||
: Gtk::TreeView(treeModel)
|
: Gtk::TreeView(treeModel)
|
||||||
{
|
{
|
||||||
|
treeModel->signal_row_inserted().connect(sigc::mem_fun(*this,
|
||||||
|
&ZebraTreeView::onRowInserted));
|
||||||
|
treeModel->signal_row_deleted().connect(sigc::mem_fun(*this,
|
||||||
|
&ZebraTreeView::onRowDeleted));
|
||||||
|
treeModel->signal_rows_reordered().connect(sigc::mem_fun(*this,
|
||||||
|
&ZebraTreeView::onRowsReordered));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -434,3 +440,62 @@ ZebraTreeView :: removeItem(const Gtk::TreeModel::iterator & iter)
|
||||||
|
|
||||||
treeModel->erase(iter);
|
treeModel->erase(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Event handler for the row_inserted signal.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ZebraTreeView :: onRowInserted(const Gtk::TreeModel::Path & path,
|
||||||
|
const Gtk::TreeModel::iterator & iter)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
renumberRows();
|
||||||
|
columns_autosize();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Event handler for the row_deleted signal.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ZebraTreeView :: onRowDeleted(const Gtk::TreeModel::Path & path)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
renumberRows();
|
||||||
|
columns_autosize();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Event handler for the rows_reordered signal.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ZebraTreeView :: onRowsReordered(const Gtk::TreeModel::Path & path,
|
||||||
|
const Gtk::TreeModel::iterator & iter,
|
||||||
|
int* mapping)
|
||||||
|
throw ()
|
||||||
|
{
|
||||||
|
renumberRows();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------
|
||||||
|
* Renumber the rows after they have changed.
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
ZebraTreeView :: renumberRows(void) throw ()
|
||||||
|
{
|
||||||
|
Glib::RefPtr<Gtk::TreeModel> treeModel = get_model();
|
||||||
|
ZebraTreeModelColumnRecord modelColumns;
|
||||||
|
int rowNumber = 0;
|
||||||
|
Gtk::TreeModel::iterator iter;
|
||||||
|
|
||||||
|
for (iter = treeModel->children().begin();
|
||||||
|
iter != treeModel->children().end(); ++iter) {
|
||||||
|
Gtk::TreeRow row = *iter;
|
||||||
|
row[modelColumns.rowNumberColumn] = rowNumber;
|
||||||
|
++rowNumber;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -88,13 +88,10 @@ LiveModeWindow :: LiveModeWindow (Ptr<GLiveSupport>::Ref gLiveSupport,
|
||||||
|
|
||||||
// Create the tree model:
|
// Create the tree model:
|
||||||
treeModel = Gtk::ListStore::create(modelColumns);
|
treeModel = Gtk::ListStore::create(modelColumns);
|
||||||
treeModel->signal_rows_reordered().connect(sigc::mem_fun(*this,
|
|
||||||
&LiveModeWindow::onRowsReordered));
|
|
||||||
treeModel->signal_row_deleted().connect(sigc::mem_fun(*this,
|
|
||||||
&LiveModeWindow::onRowDeleted));
|
|
||||||
|
|
||||||
// ... and the tree view:
|
// ... and the tree view:
|
||||||
treeView = Gtk::manage(wf->createTreeView(treeModel));
|
treeView = Gtk::manage(wf->createTreeView(treeModel));
|
||||||
|
treeView->set_reorderable(true);
|
||||||
treeView->set_headers_visible(false);
|
treeView->set_headers_visible(false);
|
||||||
treeView->set_enable_search(false);
|
treeView->set_enable_search(false);
|
||||||
|
|
||||||
|
@ -262,13 +259,6 @@ LiveModeWindow :: popTop(void) throw ()
|
||||||
treeModel->erase(iter);
|
treeModel->erase(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (iter = treeModel->children().begin();
|
|
||||||
iter != treeModel->children().end(); ++iter) {
|
|
||||||
Gtk::TreeRow row = *iter;
|
|
||||||
int rowNumber = row[modelColumns.rowNumberColumn];
|
|
||||||
row[modelColumns.rowNumberColumn] = --rowNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
return playable;
|
return playable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -191,29 +191,6 @@ class LiveModeWindow : public WhiteWindow, public LocalizedObject
|
||||||
bool
|
bool
|
||||||
onKeyPressed(GdkEventKey * event) throw ();
|
onKeyPressed(GdkEventKey * event) throw ();
|
||||||
|
|
||||||
/**
|
|
||||||
* Signal handler for the "rows reordered" event.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
onRowsReordered(const Gtk::TreeModel::Path & path,
|
|
||||||
const Gtk::TreeModel::iterator& iter,
|
|
||||||
int* newToOldMapping)
|
|
||||||
throw ()
|
|
||||||
{
|
|
||||||
// std::cerr << "rows changed: " << path.to_string() << "; "
|
|
||||||
// << "iter: " << (iter ? "true" : "false") << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Signal handler for the "row deleted" event.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
onRowDeleted(const Gtk::TreeModel::Path & path) throw ()
|
|
||||||
{
|
|
||||||
// std::cerr << "rows deleted: " << path.to_string() << ";\n";
|
|
||||||
treeView->columns_autosize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to catch the event of the close button being pressed.
|
* Function to catch the event of the close button being pressed.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue