dnd testing

This commit is contained in:
fgerlits 2007-08-28 16:02:14 +00:00
parent d22865b38b
commit a8c1eb0c3c
2 changed files with 170 additions and 198 deletions

View File

@ -90,25 +90,27 @@ TestWindow :: TestWindow (void) throw ()
comboBox->signal_changed().connect(sigc::mem_fun(*this,
&TestWindow::onComboBoxSelectionChanged));
leftTreeModel = Gtk::ListStore::create(modelColumns);
glade->get_widget_derived("treeview1", leftTreeView);
leftTreeView->set_model(leftTreeModel);
leftTreeView->connectModelSignals(leftTreeModel);
leftTreeView->appendColumn(*getResourceUstring("pixbufColumnTitle"),
modelColumns.pixbufColumn);
leftTreeView->appendColumn(*getResourceUstring("textColumnTitle"),
modelColumns.textColumn);
fillLeftTreeModel();
treeModel[0] = Gtk::ListStore::create(modelColumns);
glade->get_widget_derived("treeview1", treeView[0]);
treeView[0]->set_model(treeModel[0]);
treeView[0]->connectModelSignals(treeModel[0]);
treeView[0]->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
treeView[0]->appendColumn(*getResourceUstring("pixbufColumnTitle"),
modelColumns.pixbufColumn);
treeView[0]->appendColumn(*getResourceUstring("textColumnTitle"),
modelColumns.textColumn);
fillTreeModel(0);
rightTreeModel = Gtk::ListStore::create(modelColumns);
glade->get_widget_derived("treeview2", rightTreeView);
rightTreeView->set_model(rightTreeModel);
rightTreeView->connectModelSignals(rightTreeModel);
rightTreeView->appendColumn(*getResourceUstring("pixbufColumnTitle"),
modelColumns.pixbufColumn);
rightTreeView->appendColumn(*getResourceUstring("textColumnTitle"),
modelColumns.textColumn);
fillRightTreeModel();
treeModel[1] = Gtk::ListStore::create(modelColumns);
glade->get_widget_derived("treeview2", treeView[1]);
treeView[1]->set_model(treeModel[1]);
treeView[1]->connectModelSignals(treeModel[1]);
treeView[1]->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
treeView[1]->appendColumn(*getResourceUstring("pixbufColumnTitle"),
modelColumns.pixbufColumn);
treeView[1]->appendColumn(*getResourceUstring("textColumnTitle"),
modelColumns.textColumn);
fillTreeModel(1);
glade->get_widget("label1", label);
label->set_label(*getResourceUstring("dropHereText"));
@ -154,76 +156,57 @@ TestWindow :: configureBundle (void) throw ()
* Fill the left tree model.
*----------------------------------------------------------------------------*/
void
TestWindow :: fillLeftTreeModel (void) throw ()
TestWindow :: fillTreeModel (int index) throw ()
{
Ptr<WidgetFactory>::Ref wf = WidgetFactory::getInstance();
Glib::RefPtr<Gdk::Pixbuf> pixbuf = wf->getPixbuf(
WidgetConstants::audioClipIconImage);
Glib::ustring text;
switch (comboBox->get_active_row_number()) {
case -1: break;
Gtk::TreeModel::Row row;
treeModel[index]->clear();
if (index == 0) {
Glib::ustring text;
case 0: text = *getResourceUstring("textOne");
break;
switch (comboBox->get_active_row_number()) {
case -1: break;
case 0: text = *getResourceUstring("textOne");
break;
case 1: text = *getResourceUstring("textTwo");
break;
case 2: text = *getResourceUstring("textThree");
break;
default: break;
}
case 1: text = *getResourceUstring("textTwo");
break;
case 2: text = *getResourceUstring("textThree");
break;
default: break;
row = *treeModel[index]->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = text;
}
leftTreeModel->clear();
Gtk::TreeModel::Row row = *leftTreeModel->append();
row = *treeModel[index]->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = text;
row[modelColumns.textColumn] = (index == 0) ? "1111111111"
: "AAAAAAAAAA";
row = *leftTreeModel->append();
row = *treeModel[index]->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = "1111111111";
row[modelColumns.textColumn] = (index == 0) ? "2222222222"
: "BBBBBBBBBB";
row = *leftTreeModel->append();
row = *treeModel[index]->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = "2222222222";
row[modelColumns.textColumn] = (index == 0) ? "3333333333"
: "CCCCCCCCCC";
row = *leftTreeModel->append();
row = *treeModel[index]->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = "3333333333";
row = *leftTreeModel->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = "4444444444";
}
/*------------------------------------------------------------------------------
* Fill the right tree model.
*----------------------------------------------------------------------------*/
void
TestWindow :: fillRightTreeModel (void) throw ()
{
Ptr<WidgetFactory>::Ref wf = WidgetFactory::getInstance();
Glib::RefPtr<Gdk::Pixbuf> pixbuf = wf->getPixbuf(
WidgetConstants::audioClipIconImage);
rightTreeModel->clear();
Gtk::TreeModel::Row row = *rightTreeModel->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = "AAAAAAAAAA";
row = *rightTreeModel->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = "BBBBBBBBBB";
row = *rightTreeModel->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = "CCCCCCCCCC";
row = *rightTreeModel->append();
row[modelColumns.pixbufColumn] = pixbuf;
row[modelColumns.textColumn] = "DDDDDDDDDDD";
row[modelColumns.textColumn] = (index == 0) ? "4444444444"
: "EEEEEEEEEE";
}
@ -234,25 +217,48 @@ void
TestWindow :: setupDndCallbacks (void) throw ()
{
std::list<Gtk::TargetEntry> targets;
targets.push_back(Gtk::TargetEntry("STRING"));
targets.push_back(Gtk::TargetEntry("STRING",
Gtk::TARGET_SAME_APP));
leftTreeView->drag_source_set(targets);
leftTreeView->signal_drag_data_get().connect(sigc::mem_fun(*this,
&TestWindow::onLeftTreeViewDragDataGet));
leftTreeView->drag_dest_set(targets);
leftTreeView->signal_drag_data_received().connect(sigc::mem_fun(*this,
&TestWindow::onLeftTreeViewDragDataReceived));
// set up the left tree view
treeView[0]->drag_source_set(targets,
Gdk::MODIFIER_MASK,
Gdk::ACTION_COPY | Gdk::ACTION_MOVE);
treeView[0]->signal_drag_data_get().connect(sigc::bind<int>(
sigc::mem_fun(*this,
&TestWindow::onTreeViewDragDataGet),
0));
treeView[0]->drag_dest_set(targets,
Gtk::DEST_DEFAULT_ALL,
Gdk::ACTION_COPY | Gdk::ACTION_MOVE);
treeView[0]->signal_drag_data_received().connect(sigc::bind<int>(
sigc::mem_fun(*this,
&TestWindow::onTreeViewDragDataReceived),
0));
rightTreeView->drag_source_set(targets);
rightTreeView->signal_drag_data_get().connect(sigc::mem_fun(*this,
&TestWindow::onRightTreeViewDragDataGet));
rightTreeView->drag_dest_set(targets);
rightTreeView->signal_drag_data_received().connect(sigc::mem_fun(*this,
&TestWindow::onRightTreeViewDragDataReceived));
// set up the right tree view
treeView[1]->drag_source_set(targets,
Gdk::MODIFIER_MASK,
Gdk::ACTION_COPY | Gdk::ACTION_MOVE);
label->drag_dest_set(targets);
treeView[1]->signal_drag_data_get().connect(sigc::bind<int>(
sigc::mem_fun(*this,
&TestWindow::onTreeViewDragDataGet),
1));
treeView[1]->drag_dest_set(targets,
Gtk::DEST_DEFAULT_ALL,
Gdk::ACTION_COPY | Gdk::ACTION_MOVE);
treeView[1]->signal_drag_data_received().connect(sigc::bind<int>(
sigc::mem_fun(*this,
&TestWindow::onTreeViewDragDataReceived),
1));
// set up the label
label->drag_dest_set(targets,
Gtk::DEST_DEFAULT_ALL,
Gdk::ACTION_COPY | Gdk::ACTION_MOVE);
label->signal_drag_data_received().connect(sigc::mem_fun(*this,
&TestWindow::onLabelDragDataReceived));
&TestWindow::onLabelDragDataReceived));
}
@ -262,7 +268,7 @@ TestWindow :: setupDndCallbacks (void) throw ()
void
TestWindow :: onComboBoxSelectionChanged (void) throw ()
{
fillLeftTreeModel();
fillTreeModel(0);
}
@ -303,65 +309,25 @@ TestWindow :: run (void) throw ()
* The callback for the start of the drag.
*----------------------------------------------------------------------------*/
void
TestWindow :: onLeftTreeViewDragDataGet(
TestWindow :: onTreeViewDragDataGet(
const Glib::RefPtr<Gdk::DragContext> & context,
Gtk::SelectionData & selectionData,
guint info,
guint time)
guint time,
int index)
throw ()
{
Glib::RefPtr<Gtk::TreeView::Selection> selection
= leftTreeView->get_selection();
Gtk::TreeModel::Row row = *selection->get_selected();
Glib::ustring dropString = row[modelColumns.textColumn];
selectionData.set(selectionData.get_target(),
8 /* 8 bits format*/,
(const guchar *) dropString.c_str(),
dropString.bytes());
}
/*------------------------------------------------------------------------------
* The callback for the end of the drag.
*----------------------------------------------------------------------------*/
void
TestWindow :: onLeftTreeViewDragDataReceived(
const Glib::RefPtr<Gdk::DragContext> & context,
int x,
int y,
const Gtk::SelectionData & selectionData,
guint info,
guint time)
throw ()
{
if (selectionData.get_length() >= 0 && selectionData.get_format() == 8) {
Glib::ustring data = selectionData.get_data_as_string();
std::cerr << "string '" << data << "' dropped on LEFT tree view\n";
context->drag_finish(true, false, time);
} else {
std::cerr << "unknown type of data dropped on LEFT tree view\n";
context->drag_finish(false, false, time);
= treeView[index]->get_selection();
std::list<Gtk::TreePath> rows = selection->get_selected_rows();
Glib::ustring dropString = leftOrRight(index);
// we can assume there is only one row selected, due to bug
// ...
if (rows.size() >= 1) {
Gtk::TreeRow row = *treeModel[index]->get_iter(rows.front());
dropString += " ";
dropString += row[modelColumns.textColumn];
}
}
/*------------------------------------------------------------------------------
* The callback for the start of the drag.
*----------------------------------------------------------------------------*/
void
TestWindow :: onRightTreeViewDragDataGet(
const Glib::RefPtr<Gdk::DragContext> & context,
Gtk::SelectionData & selectionData,
guint info,
guint time)
throw ()
{
Glib::RefPtr<Gtk::TreeView::Selection> selection
= rightTreeView->get_selection();
Gtk::TreeModel::Row row = *selection->get_selected();
Glib::ustring dropString = row[modelColumns.textColumn];
selectionData.set(selectionData.get_target(),
8 /* 8 bits format*/,
@ -374,22 +340,45 @@ TestWindow :: onRightTreeViewDragDataGet(
* The callback for the end of the drag.
*----------------------------------------------------------------------------*/
void
TestWindow :: onRightTreeViewDragDataReceived(
TestWindow :: onTreeViewDragDataReceived(
const Glib::RefPtr<Gdk::DragContext> & context,
int x,
int y,
const Gtk::SelectionData & selectionData,
guint info,
guint time)
guint time,
int index)
throw ()
{
if (selectionData.get_length() >= 0 && selectionData.get_format() == 8) {
Glib::ustring data = selectionData.get_data_as_string();
std::cerr << "string '" << data << "' dropped on RIGHT tree view\n";
context->drag_finish(true, false, time);
if (data.find("left") == 0) {
std::cerr << "left -> "
<< leftOrRight(index)
<< ": "
<< data.substr(5)
<< std::endl;
context->drag_finish(true, false, time);
} else if (data.find("right") == 0) {
std::cerr << "right -> "
<< leftOrRight(index)
<< ": "
<< data.substr(6)
<< std::endl;
context->drag_finish(true, false, time);
} else {
std::cerr << "unknown string dropped on "
<< leftOrRight(index)
<< " tree view: "
<< data
<< std::endl;
context->drag_finish(false, false, time);
}
} else {
std::cerr << "unknown type of data dropped on RIGHT tree view\n";
std::cerr << "unknown type of data dropped on "
<< leftOrRight(index)
<< " tree view"
<< std::endl;
context->drag_finish(false, false, time);
}
}
@ -411,7 +400,7 @@ TestWindow :: onLabelDragDataReceived(
if (selectionData.get_length() >= 0 && selectionData.get_format() == 8) {
Glib::ustring data = selectionData.get_data_as_string();
label->set_label(data);
context->drag_finish(true, false, time);
context->drag_finish(true, true, time);
} else {
label->set_label(*getResourceUstring("dropHereText"));

View File

@ -81,22 +81,33 @@ class TestWindow : public LocalizedObject
configureBundle (void) throw ();
/**
* Fill the left tree model.
* Fill one of the tree models.
*
* @param index which tree model to fill.
*/
void
fillLeftTreeModel (void) throw ();
/**
* Fill the right tree model.
*/
void
fillRightTreeModel (void) throw ();
fillTreeModel (int index) throw ();
/**
* Set up the D'n'D callbacks.
*/
void
setupDndCallbacks (void) throw ();
/**
* Return either "left" or "right".
*
* @param index 0 for left, 1 for right.
*/
Glib::ustring
leftOrRight (int index) throw ()
{
if (index == 0) {
return "left";
} else {
return "right";
}
}
protected:
@ -112,14 +123,9 @@ class TestWindow : public LocalizedObject
ComboBoxText * comboBox;
/**
* The left tree view.
* The tree views.
*/
ZebraTreeView * leftTreeView;
/**
* The right tree view.
*/
ZebraTreeView * rightTreeView;
ZebraTreeView * treeView[2];
/**
* The drop target label.
@ -165,14 +171,9 @@ class TestWindow : public LocalizedObject
ModelColumns modelColumns;
/**
* The left tree model, as a GTK reference.
* The tree models, as GTK references.
*/
Glib::RefPtr<Gtk::ListStore> leftTreeModel;
/**
* The right tree model, as a GTK reference.
*/
Glib::RefPtr<Gtk::ListStore> rightTreeModel;
Glib::RefPtr<Gtk::ListStore> treeModel[2];
/**
* Event handler for selection change in the combo box.
@ -194,50 +195,32 @@ class TestWindow : public LocalizedObject
/**
* The callback for the start of the drag.
*
* @param index which tree view to drag from.
*/
virtual void
onLeftTreeViewDragDataGet(
onTreeViewDragDataGet(
const Glib::RefPtr<Gdk::DragContext> & context,
Gtk::SelectionData & selectionData,
guint info,
guint time)
guint time,
int index)
throw ();
/**
* The callback for the end of the drag.
*
* @param index which tree view to drop to.
*/
virtual void
onLeftTreeViewDragDataReceived(
onTreeViewDragDataReceived(
const Glib::RefPtr<Gdk::DragContext> & context,
int x,
int y,
const Gtk::SelectionData & selectionData,
guint info,
guint time)
throw ();
/**
* The callback for the start of the drag.
*/
virtual void
onRightTreeViewDragDataGet(
const Glib::RefPtr<Gdk::DragContext> & context,
Gtk::SelectionData & selectionData,
guint info,
guint time)
throw ();
/**
* The callback for the end of the drag.
*/
virtual void
onRightTreeViewDragDataReceived(
const Glib::RefPtr<Gdk::DragContext> & context,
int x,
int y,
const Gtk::SelectionData & selectionData,
guint info,
guint time)
guint time,
int index)
throw ();
/**