0

This is the same problem as in my previous question, but I moved to python3/gtk3 to be able to use a css for setting the basic properties.

From the python file:

self.w = Gtk.Window()
self.w.set_name("App")

I can use a css:

#App GtkTreeView row:selected {
    border-color: #000000;
    border-top-width: 1px;
    border-bottom-width: 1px;
    color: #000;
}

And easily permanently change the style of the selection. To me this means that I should be able to dynamically get access to the row-object and its style where I could set the bg for the Gtk.StateFlags.SELECTED.

I've tried a bunch of weird ways, e.g (where bg_color is a Gdk.Color that works fine for e.g. changing the style of a Label outside the TreeView).

        style=self.treeview.get_style_context()
        col = style.get_background_color(Gtk.StateFlags.SELECTED)
        col.alpha =  1.0
        col.blue = bg_color.blue
        col.red = bg_color.red
        col.green = bg_color.green

Or:

        style = self.treeview.get_style().copy()
        style.bg[Gtk.StateFlags.SELECTED] = bg_color
        self.treeview.set_style(style)

(produces error: style.bg[Gtk.StateFlags.SELECTED] = bg_color IndexError: list assignment index out of range)

etcetera...

So please, how do I find the way to dynamically change the selection effect depending on the normal-color of the row? Or in other words, how do I find my way to the object that actually holds the style-setting for the selection?

1 Answer 1

2

I had one last idea about how it could be done after posting which actually ended up working:

Reloading the css dynamically:

In the css I added a row leaving the value for the background open to dynamic substitution:

#App GtkTreeView row:selected {
    border-color: #400;
    border-top-width: 2px;
    border-bottom-width: 2px;
    background: {0};
    color: #000;
}

Then I loaded the css in python:

    screen = Gdk.Screen.get_default()
    self._css_provider = Gtk.CssProvider()
    css = open("notify_stack.css", 'rb')
    self._css = css.read()
    css.close()
    self._css_from = bytes("{0}".encode("utf8"))
    self._css_provider.load_from_data(self._css.replace(
        self._css_from,   
        bytes("#fff".encode("utf8"))))
    context = Gtk.StyleContext()
    context.add_provider_for_screen(screen, self._css_provider,
        Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

Later in the callback for when a row is selected I put this row (data is my ListStore):

        self._css_provider.load_from_data(
            self._css.replace(self._css_from,
                bytes(data[rows[0]][self.BG_COLOR].encode("utf8"))))

It feels really brute, there must be a nicer way, but hey it actually worked.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.