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

View file

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