On Wed, 2010-07-07 at 10:23 +0200, Murray Cumming wrote: > On Tue, 2010-07-06 at 02:08 +0200, Staffan Gimåker wrote: > > I tried deriving a new model from TreeModelFilter, TreeDragDest and > > TreeDragSource, implementing the virtual functions in the latter two, > > but that did not work -- the virtual functions were never called and I > > got the GTK assertion below: > > > > "Gtk-WARNING **:You must override the default 'drag_data_received' > > handler on GtkTreeView when using models that don't support the > > GtkTreeDragDest interface and enabling drag-and-drop. > [snip] > > > Connecting to the signal_drag_data_received() did not make a > > difference. > [snip] > > It's asking you to override on_drag_data_received() (the default signal > handler), not just connect to signal_drag_data_received(). Of course, > that's not obvious. > > If that doesn't help, please try to create a simple test case. This > sounds rather awkward but that might let us help. I attached a stripped down test case. It consists of a derived TreeModel that overrides the row_draggable_vfunc() etc. methods and a class derived from TreeView, overriding on_drag_data_received(). Each of the overridden methods basically just print out the function name and does little else. The good news is that the Gtk-WARNING disappears. The bad news is that none of the overridden methods in my tree model are called. And even worse, it also hangs my system. Not in a everything freezes way, but it messes up the input system, the mouse in particular is left totally unusable. The "hang" can only be cured with a restart or by killing the application. To be on the safe side I recommend that you test run it by doing: ./dndtest & sleep 15 && killall dndtest /Staffan
#include <gtkmm.h>
#include <iostream>
class MyModel : public Gtk::TreeModelFilter,
public Gtk::TreeDragDest,
public Gtk::TreeDragSource
{
public:
static Glib::RefPtr<MyModel> create(
const Glib::RefPtr<Gtk::TreeModel> &child_model)
{
return Glib::RefPtr<MyModel>(new MyModel(child_model));
}
protected:
MyModel(const Glib::RefPtr<Gtk::TreeModel> &child_model)
: Gtk::TreeModelFilter(child_model) {}
virtual bool row_draggable_vfunc(const Gtk::TreeModel::Path &path) const
{
std::cout << "row_draggable_vfunc" << std::endl;
return true;
}
virtual bool drag_data_get_vfunc(
const Gtk::TreeModel::Path &path,
Gtk::SelectionData &selection_data) const
{
std::cout << "drag_data_get_vfunc" << std::endl;
return true;
}
virtual bool drag_data_delete_vfunc(const Gtk::TreeModel::Path &path)
{
std::cout << "drag_data_delete_vfunc" << std::endl;
return true;
}
virtual bool row_drop_possible_vfunc(
const Gtk::TreeModel::Path &dest_path,
const Gtk::SelectionData &selection_data) const
{
std::cout << "row_drop_possible_vfunc" << std::endl;
return true;
}
virtual bool drag_data_received_vfunc(
const Gtk::TreeModel::Path &dest,
const Gtk::SelectionData &selection_data)
{
std::cout << "drag_data_received_vfunc" << std::endl;
return true;
}
};
class MyTreeView : public Gtk::TreeView
{
public:
protected:
virtual void on_drag_data_received(
const Glib::RefPtr<Gdk::DragContext> &context,
int x, int y,
const Gtk::SelectionData &selection_data,
guint info, guint time)
{
std::cout << "on_drag_data_received" << std::endl;
context->drag_finish(false, false, time);
}
};
struct MyCols : public Gtk::TreeModelColumnRecord
{
MyCols() { add(m_name); }
Gtk::TreeModelColumn<std::string> m_name;
};
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
Gtk::Window window;
MyCols cols;
Glib::RefPtr<Gtk::TreeStore> model = Gtk::TreeStore::create(cols);
Glib::RefPtr<Gtk::TreeModelFilter> filter =
Gtk::TreeModelFilter::create(model);
Glib::RefPtr<MyModel> my_model = MyModel::create(filter);
for( int i = 0; i < 3; ++i )
{
Gtk::TreeModel::Row row = *model->append();
row[cols.m_name] = "Test";
}
MyTreeView view;
view.set_model(my_model);
view.set_reorderable(true);
view.append_column("Name", cols.m_name);
view.show();
window.add(view);
Gtk::Main::run(window);
return 0;
}
Attachment:
signature.asc
Description: This is a digitally signed message part