Я делаю текстовый редактор с помощью GTK3 в Vala. Я должен перетащить файл и, когда я бросаю его в окно приложения, приложение открывает тот файл. Я использую a Gtk.Notebook
это содержит Gtk.SourceView
. Это работает, когда я бросаю файл в пустое Gtk.Notebook
, но когда существует по крайней мере один Gtk.SourceView
добавленный на нем, SourceView
захватывает URI файла, показывает его, и окно не может обработать открытие файла.
В этом случае, что я могу сделать для предотвращения a Gtk.SourceView
от захвата URI файла, когда я бросаю файл в a Gtk.SourceView
.
PS: Я пытался использовать drag_dest_unset()
в SourceView
производный класс. Это работало, SourceView
не захватил URI, и окно могло открыть файл, но приложение показало сообщение как это во времени выполнения:
Gtk-WARNING **: Can't set a target list on a widget until you've called gtk_drag_dest_set() to make the widget into a drag destination
Сделать Gtk.SourceView
прекратите захватывать uri, я использовал следующий фрагмент кода:
public class MySourceView: Gtk.SourceView {
public MySourceView() {
Gtk.TargetEntry[] targets;
targets = new Gtk.TargetEntry[1];
targets[0].target = "text/uri-list";
targets[0].flags = 0;
targets[0].info = 0;
Gtk.drag_dest_set(this, Gtk.DestDefaults.ALL, targets, Gdk.DragAction.COPY);
this.drag_data_received.connect(this.drag_data_received_cb);
}
private void drag_data_received_cb(Gtk.Widget sender,
Gdk.DragContext drag_context,
int x, int y,
Gtk.SelectionData data,
uint info, uint time) {
print("Drag data received!\n");
// Do something
Gtk.drag_finish (drag_context, true, false, time);
}
}
Таким образом, uri файла, что я заглядываю исходному представлению, не вставляется в нем, и я могу открыть файл на другой вкладке.
Это кажется, что Вы пытаетесь перетащить файл в виджет SourceView с идеей, что он откроет новую вкладку вместо того, чтобы открыть тот файл в том исходном виджете представления.
То, что необходимо сделать, не, отключают событие перетаскивания, необходимо перенаправить его. Событие войдет в sourceview виджет, и затем Вы соединяетесь с ним и передаете его своему коду (в Вашем окне?), который имеет дело с открытием новой вкладки.
Это имеет смысл? Вам нужны примеры кода?