Изменение цвета выбранного элемента в GtkTreeview с использованием Python - PullRequest
6 голосов
/ 23 июня 2010

У меня есть диалог, который содержит pygtk.treeview для перечисления задач по приоритетам.Для каждой строки цвет фона устанавливается на основе этого приоритета, поэтому, например, наивысший приоритет имеет светло-красный фон.

Цвет выбора строки изменить не так просто.Я могу установить его, используя treeview.modify_base(gtk.STATE_SELECTED, "#C4C4C4"), но никакие цвета не работают с цветами, используемыми для усиления концепции приоритета.

У меня была идея изменить цвет выделения, чтобы он стал немного темнее, чем использованный цвет.как в обычном фоне строки, так и в примере выше, это будет темно-красный.Я попытался вызвать вышеупомянутую функцию в ответ на сигнал changed выбора дерева, и он работает, но с сильным мерцанием.

Другая идея состояла в том, чтобы изменить выделение на прозрачное и вместо этого поставить рамку вокруг него, но какнасколько я могу судить, это невозможно.

  1. Как я могу изменить цвет выделения, как описано выше, без мерцания?
  2. Можно ли изменить показ выбора с помощьюиметь только рамку вокруг строки?

Примечание. Мне известно, что это нарушает тему, выбранную пользователем.Я чувствую, что у меня есть для этого веская причина.Наличие приоритета, обозначенного цветом, делает его мгновенно узнаваемым.Цвет выделения скрывает это.Если у вас есть альтернативные предложения, я открыт для них, но при этом необходимо сохранить легкость, с которой пользователь может определить приоритет.

Ответы [ 4 ]

2 голосов
/ 23 июня 2010

Вы можете добавить отдельную ячейку pixbuf (скажем, такого же размера, как маленький значок) в крайнем левом углу, чтобы указать выбор. Выбранные строки могут заполнить это более «сплошной» (насыщенной) версией цвета, используемого для фона. Например. если вы используете розовый фон для высокого приоритета, вы можете использовать красный для индикатора выбора. Или вы можете использовать иконку.

Чтобы реализовать это с помощью метода заливки цветом:

  1. Отключите встроенную подсветку в соответствии с предложением Тобиаса («сделайте цвет STATE_SELECTED идентичным STATE_NORMAL»).
  2. Создание виджета на основе gtk.gdk.Pixbuf, позволяющего создать сплошную область цвета, возможно, с использованием метода fill.
  3. Используйте CellRendererPixbuf для своей ячейки "выделения".

Затем можно изменить цвет или цвет «ячейки выбора» после изменения выбора, чтобы указать, какая строка выбрана, или отобразить значок (например, символ акции).

Обратите внимание, что я этого не реализовал, это всего лишь идея. Он значительно отличается от обычной индикации выбора GTK, поэтому (очевидно) используйте свое суждение относительно того, можно ли его использовать.

1 голос
/ 03 марта 2012

Вы можете использовать метод, описанный здесь & ndash; Я проверил это кратко, и он делает работу без мерцания. По сути, дело в том, чтобы использовать свойство «Разметка» средства визуализации ячеек. Однако есть одна загвоздка: если вы хотите изменить цвет background с помощью этого метода, изменится только фон за «фактическим» текстом, а не вся строка. Однако, если вы хотите изменить цвет текста У меня есть следующий CellDataFunc (это C #, но я надеюсь, что он все еще полезен):

private void CellDataFunc(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter) {
    Item item = (Item) model.GetValue (iter, 0);
    if(cell is CellRendererText) {
        int id = (int)column.GetData("colId");
        string text = "";
        switch(id) {
            case 0: text = item.Name;  break;
            case 1: text = item.Size; break;
            case 2: text = item.Time.ToString();  break;                
        }
        //(cell as Gtk.CellRendererText).Text = text;
        if(item.Highlight) {
            (cell as Gtk.CellRendererText).Markup = 
                            "<span background=\"red\">"+text+"</span>";
        } else {
            (cell as Gtk.CellRendererText).Markup = text;
        }
    }
}
0 голосов
/ 20 марта 2017

Вопрос устарел, но кому-то еще может быть полезно ... Для полного отключения выделения и создания эффекта наведения в дереве: 1. Отключить выбор системы в дереве:

  _treeView.Selection.Mode = SelectionMode.None;
  1. Обработка события MotionNotifyEvent:

    [ConnectBefore]
    private void TreeViewOnMotionNotifyEvent(object o, MotionNotifyEventArgs args)
    {
        TreePath treePath;
        TreeIter iter;
    
        int x = Convert.ToInt32(args.Event.X);
        int y = Convert.ToInt32(args.Event.Y);
    
        _treeView.GetPathAtPos(x, y, out treePath);
        _treeView.Model.GetIter(out iter, treePath);
    
        BindObject fieldModel = CellUtil.GetModelValue(_treeView.Model, iter, 1) as BindObject;
    
        HoverLine = _vievModel.BindObjectCollection.IndexOf(fieldModel);
    }
    
  2. В методе SetCellDataFunc:

    BindObject fieldModel = CellUtil.GetModelValue(treeModel, iter, 1) as BindObject;
    int rowCount = _vievModel.BindObjectCollection.IndexOf(fieldModel);
    
    if (HoverLine == rowCount)
    {
            cellRenderer.CellBackgroundGdk = ThemeUtility.GdkOddSelectionColor; //Your selection color
    }
    else
    {
            cellRenderer.CellBackgroundGdk = ThemeUtility.SystemSelectionColor; //Your system selection color
    }
    ...
    
0 голосов
/ 23 июня 2010

Не уверен, что вы подразумеваете под мерцанием. Граница потребует создания подкласса TreeView.

Я бы сделал цвет STATE_SELECTED идентичным цвету STATE_NORMAL, чтобы отключить встроенную подсветку. Затем установите data_func для каждого столбца и измените цвет для средства визуализации ячеек в зависимости от того, находится он в выделении или нет.

Вы, вероятно, уже делаете это для своего приоритета, поэтому просто умножьте цвет на что-нибудь, чтобы выделить строку.

...