Thread overview | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
June 24, 2016 GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Hello, i would like to flash some buttons with CSS. My current approach: for(int i = 0; i < level; i++){ Button currentButton = bArr[rndButtonBlink[i]]; ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().addClass(CSSClassName ~ "-flash"); writeln(CSSClassName); //some kind of delay currentButton.getStyleContext().removeClass(CSSClassName ~ "-flash"); } The color changing part works fine but if i use some kind of delay the program just starts delayed but no color changing happens. I am wondering why, because everything is executed in one thread, so the execution order looks like this to me: 1. Start GUI 2. Change Button Color to flash color 3. Wait 2 sec 4. Change Button Color back to standard but instead it looks like this: 1. Wait 2 sec 2. Start GUI 3. Change Button Color to flash color 4. Change Button Color back to standard Now because a delay is missing the change between the colors happens unnoticeable fast. I hope i can get around it without getting into multithreading? |
June 24, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to TheDGuy | On Friday, 24 June 2016 at 12:38:37 UTC, TheDGuy wrote: > The color changing part works fine but if i use some kind of delay the program just starts delayed but no color changing happens. I am wondering why, because everything is executed in one thread, so the execution order looks like this to me: > > 1. Start GUI > 2. Change Button Color to flash color > 3. Wait 2 sec > 4. Change Button Color back to standard Everything in GTK runs in the same thread, if your delay is a blocking one (i.e. putting the thread to sleep for 2 seconds) none of the GTK events will fire to redraw the button since the thread is occupied with your delay. > I hope i can get around it without getting into multithreading? Other then the obvious multi-threaded, using glib.Timeout to trigger the reversion of the color change could be an option. http://api.gtkd.org/src/glib/Timeout.html |
June 24, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to Gerald | On Friday, 24 June 2016 at 16:44:59 UTC, Gerald wrote: > Other then the obvious multi-threaded, using glib.Timeout to trigger the reversion of the color change could be an option. > > http://api.gtkd.org/src/glib/Timeout.html Thanks! I tried this so far: private void letButtonsFlash(){ foreach(Button btn;bArr){ btn.setSensitive(false); } for(int i = 0; i < level; i++){ Button currentButton = bArr[rndButtonBlink[i]]; ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().addClass(CSSClassName ~ "-flash"); writeln(CSSClassName); Timeout t = new Timeout(&timeout_delay,1,true); currentButton.getStyleContext().removeClass(CSSClassName ~ "-flash"); } foreach(Button btn;bArr){ btn.setSensitive(true); } } bool timeout_delay(){ Thread.sleep(dur!("seconds")(5)); return false; } and it is "working" to the extend that at least the CSSClassName gets written in the console but the UI again just pops up after 5 sec. Could you give me a tip? |
June 25, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to TheDGuy | On 06/24/2016 10:03 PM, TheDGuy wrote: > On Friday, 24 June 2016 at 16:44:59 UTC, Gerald wrote: >> Other then the obvious multi-threaded, using glib.Timeout to trigger >> the reversion of the color change could be an option. >> >> http://api.gtkd.org/src/glib/Timeout.html > > Thanks! I tried this so far: > private void letButtonsFlash(){ > foreach(Button btn;bArr){ > btn.setSensitive(false); > } > for(int i = 0; i < level; i++){ > Button currentButton = bArr[rndButtonBlink[i]]; > ListG list = currentButton.getStyleContext().listClasses(); > string CSSClassName = to!string(cast(char*)list.next().data); > currentButton.getStyleContext().addClass(CSSClassName ~ > "-flash"); > writeln(CSSClassName); > Timeout t = new Timeout(&timeout_delay,1,true); > currentButton.getStyleContext().removeClass(CSSClassName ~ > "-flash"); > > } > foreach(Button btn;bArr){ > btn.setSensitive(true); > } > } > bool timeout_delay(){ > Thread.sleep(dur!("seconds")(5)); > return false; > } > > and it is "working" to the extend that at least the CSSClassName gets > written in the console but the UI again just pops up after 5 sec. Could > you give me a tip? You should change the css class in the timeout_delay function. It's called by the GTK main loop every time the amount of seconds passed to the constructor has passed. And return true if you want to continue to flash the button, and false to stop. Also don't sleep in the timeout function, the main loop should take care of that, currently you are blocking the main thread for 5 seconds. -- Mike Wey |
June 25, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Wey | On Saturday, 25 June 2016 at 11:45:40 UTC, Mike Wey wrote:
>
>
> You should change the css class in the timeout_delay function.
>
> It's called by the GTK main loop every time the amount of seconds passed to the constructor has passed. And return true if you want to continue to flash the button, and false to stop.
>
> Also don't sleep in the timeout function, the main loop should take care of that, currently you are blocking the main thread for 5 seconds.
Thanks for your answer.
I have to pass the Button object to my timeout function to change the CSS class. But how do i do that within the Timeout constructor?
|
June 25, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to TheDGuy | On Saturday, 25 June 2016 at 13:01:09 UTC, TheDGuy wrote: > Thanks for your answer. > I have to pass the Button object to my timeout function to change the CSS class. But how do i do that within the Timeout constructor? I mean: I have to pass my function and delay time to the constructor, but i can't pass any data to the function here, also only functions are allowed (at least it looks like that to me) who don't have parameters. If i want to add a new function i have to use the function .add(), with this function i can pass 'userData' (so my button for example). But why am i unable to do that in the constructor? Do i have 2 different functions for the same thing, one with the other one without parameter? My current approach: private void letButtonsFlash(){ foreach(Button btn;bArr){ btn.setSensitive(false); } for(int i = 0; i < level; i++){ Button currentButton = bArr[rndButtonBlink[i]]; ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().addClass(CSSClassName ~ "-flash"); //writeln(CSSClassName); Timeout t = new Timeout(&timeout_delay,5,false); //error appears here t.add(5,&timeout_delay,currentButton); } foreach(Button btn;bArr){ btn.setSensitive(true); } } bool timeout_delay(Button currentButton){ ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().removeClass(CSSClassName ~ "-flash"); return false; } But i get the error: Error: none of the overloads of '__ctor' are callable using argument types (bool delegate(void* userData), int, bool), candidates are: glib.Timeout.Timeout.this(uint interval, bool delegate() dlg, bool fireNow = false) glib.Timeout.Timeout.this(uint interval, bool delegate() dlg, GPriority priority, bool fireNow = false) glib.Timeout.Timeout.this(bool delegate() dlg, uint seconds, bool fireNow = false) glib.Timeout.Timeout.this(bool delegate() dlg, uint seconds, GPriority priority, bool fireNow = false) If i take a look at GTK for C it looks like there is a function for that: http://www.gtk.org/tutorial1.2/gtk_tut-17.html Why is this so confusing? |
June 25, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to TheDGuy | On Saturday, 25 June 2016 at 15:26:00 UTC, TheDGuy wrote: }
> But i get the error:
> Error: none of the overloads of '__ctor' are callable using argument types (bool delegate(void* userData), int, bool), candidates are:
This is the correct error message:
Error: none of the overloads of '__ctor' are callable using argument types (bool delegate(Button currentButton), int, bool), candidates are:
|
June 25, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to TheDGuy | On 06/25/2016 05:26 PM, TheDGuy wrote: > On Saturday, 25 June 2016 at 13:01:09 UTC, TheDGuy wrote: >> Thanks for your answer. >> I have to pass the Button object to my timeout function to change the >> CSS class. But how do i do that within the Timeout constructor? > > I mean: > > I have to pass my function and delay time to the constructor, but i > can't pass any data to the function here, also only functions are > allowed (at least it looks like that to me) who don't have parameters. > > If i want to add a new function i have to use the function .add(), with > this function i can pass 'userData' (so my button for example). But why > am i unable to do that in the constructor? Do i have 2 different > functions for the same thing, one with the other one without parameter? > > My current approach: > > private void letButtonsFlash(){ > foreach(Button btn;bArr){ > btn.setSensitive(false); > } > for(int i = 0; i < level; i++){ > Button currentButton = bArr[rndButtonBlink[i]]; > ListG list = currentButton.getStyleContext().listClasses(); > string CSSClassName = to!string(cast(char*)list.next().data); > currentButton.getStyleContext().addClass(CSSClassName ~ > "-flash"); > //writeln(CSSClassName); > Timeout t = new Timeout(&timeout_delay,5,false); //error > appears here > t.add(5,&timeout_delay,currentButton); > } > foreach(Button btn;bArr){ > btn.setSensitive(true); > } > } > bool timeout_delay(Button currentButton){ > ListG list = currentButton.getStyleContext().listClasses(); > string CSSClassName = to!string(cast(char*)list.next().data); > currentButton.getStyleContext().removeClass(CSSClassName ~ > "-flash"); > return false; > } > > But i get the error: > Error: none of the overloads of '__ctor' are callable using argument > types (bool delegate(void* userData), int, bool), candidates are: > glib.Timeout.Timeout.this(uint interval, bool delegate() dlg, bool > fireNow = false) > glib.Timeout.Timeout.this(uint interval, bool delegate() dlg, GPriority > priority, bool fireNow = false) > glib.Timeout.Timeout.this(bool delegate() dlg, uint seconds, bool > fireNow = false) > glib.Timeout.Timeout.this(bool delegate() dlg, uint seconds, GPriority > priority, bool fireNow = false) > > If i take a look at GTK for C it looks like there is a function for that: > > http://www.gtk.org/tutorial1.2/gtk_tut-17.html > > Why is this so confusing? The constructor accepts an delegate, witch can access it's context so it has access to some of the data. The functions from GTK are also available like Timeout.add from the linked tutorial: http://api.gtkd.org/src/glib/Timeout.html#Timeout.add You may want to do something like this: ``` private void letButtonsFlash() { foreach(Button btn;bArr){ btn.setSensitive(false); } Timeout t = new Timeout(&timeout_delay,5,false); } private bool timeout_delay() { for(int i = 0; i < level; i++){ Button currentButton = bArr[rndButtonBlink[i]]; ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().addClass(CSSClassName ~ "-flash"); } return false; } ``` -- Mike Wey |
June 25, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Wey | On Saturday, 25 June 2016 at 20:39:53 UTC, Mike Wey wrote: > > The constructor accepts an delegate, witch can access it's context so it has access to some of the data. > > The functions from GTK are also available like Timeout.add from the linked tutorial: http://api.gtkd.org/src/glib/Timeout.html#Timeout.add > > > You may want to do something like this: > > ``` > private void letButtonsFlash() > { > foreach(Button btn;bArr){ > btn.setSensitive(false); > } > > Timeout t = new Timeout(&timeout_delay,5,false); > } > > private bool timeout_delay() > { > for(int i = 0; i < level; i++){ > Button currentButton = bArr[rndButtonBlink[i]]; > ListG list = currentButton.getStyleContext().listClasses(); > string CSSClassName = to!string(cast(char*)list.next().data); > currentButton.getStyleContext().addClass(CSSClassName ~ "-flash"); > } > > return false; > } > > ``` Thanks a lot for your answer, i tried it like this and it works: private void letButtonsFlash(){ foreach(Button btn;bArr){ btn.setSensitive(false); } for(int i = 0; i < level; i++){ Button currentButton = bArr[rndButtonBlink[i]]; ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().addClass(CSSClassName ~ "-flash"); } Timeout t = new Timeout(&timeout_delay,1,false); foreach(Button btn;bArr){ btn.setSensitive(true); } } bool timeout_delay(){ for(int i = 0; i < level; i++){ Button currentButton = bArr[rndButtonBlink[i]]; ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().removeClass(CSSClassName ~ "-flash"); } return false; } But i want to flash (e.g. change the CSS class) the buttons one by one and not all at the sime time? How am i going to do that? |
June 25, 2016 Re: GTKD - CSS class color "flash" delay | ||||
---|---|---|---|---|
| ||||
Posted in reply to TheDGuy | On Saturday, 25 June 2016 at 21:57:35 UTC, TheDGuy wrote: > But i want to flash (e.g. change the CSS class) the buttons one by one and not all at the sime time? How am i going to do that? Okay, i tried it with a new private int-variable which contains the current index of the for-loop, like this: private void letButtonsFlash(){ foreach(Button btn;bArr){ btn.setSensitive(false); } for(int i = 0; i < level; i++){ index = i; //index is public Button currentButton = bArr[rndButtonBlink[i]]; ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().addClass(CSSClassName ~ "-flash"); Timeout t = new Timeout(&timeout_delay,1,false); } foreach(Button btn;bArr){ btn.setSensitive(true); } } bool timeout_delay(){ Button currentButton = bArr[rndButtonBlink[index]]; ListG list = currentButton.getStyleContext().listClasses(); string CSSClassName = to!string(cast(char*)list.next().data); currentButton.getStyleContext().removeClass(CSSClassName ~ "-flash"); return false; } But now the strange thing happens, that the first button lights up as expected but the second button remains at its "flash color" and doesn't go back to normal color, i don't understand why this happens? Any ideas? |
Copyright © 1999-2021 by the D Language Foundation