Как предотвратить Gtk. SourceView от захвата URI файла

Я делаю текстовый редактор с помощью 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
0
задан 19 December 2014 в 02:09

2 ответа

Сделать 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 файла, что я заглядываю исходному представлению, не вставляется в нем, и я могу открыть файл на другой вкладке.

1
ответ дан 24 December 2019 в 16:48

Это кажется, что Вы пытаетесь перетащить файл в виджет SourceView с идеей, что он откроет новую вкладку вместо того, чтобы открыть тот файл в том исходном виджете представления.

То, что необходимо сделать, не, отключают событие перетаскивания, необходимо перенаправить его. Событие войдет в sourceview виджет, и затем Вы соединяетесь с ним и передаете его своему коду (в Вашем окне?), который имеет дело с открытием новой вкладки.

Это имеет смысл? Вам нужны примеры кода?

0
ответ дан 24 December 2019 в 16:48

Другие вопросы по тегам:

Похожие вопросы: