Re: Problems with AnimationCtrl in a CustomTreeCtrl
Hélio Guilherme <[email protected]> Sat, 28 Apr 2018 16:18:01 -0700 (PDT)
| Newsgroups | gmane.comp.python.wxpython.devel |
|---|---|
| Message-ID | <[email protected]> |
I have created https://github.com/wxWidgets/Phoenix/pull/828. <https://github.com/wxWidgets/Phoenix/pull/828> We can assign the Window to the right of text (as the original does), or to the left of text overlapping the image. This is the only way to have a GIF animation over the image. I am still trying to fix, hiding the Window when the tree is collapsing. I managed to do this from my application, but I'd like to have it built in CustomTreeItem. *Default SetImage:* *Collapsing not fixed:* *Collapsing Fixed at my application side:* *SetImage with new parameter on_the_right == False:* TODO: Update demo. sexta-feira, 27 de Abril de 2018 às 14:13:51 UTC+1, Hélio Guilherme escreveu: > > Thank you Andrea, > > I will follow option 1. > > In fact I will propose a PR to add a way to place the Window before or > after the text. > Currently, the Window appears at the right of the text, but I have already > changed to overlap the Image at right of checkbox and at left of text. > > I'll do also testing on when the event "COLLAPSING" if the Window will be > hidden (I had to bind to it before modifying CustomTreeCtrl). > > quarta-feira, 25 de Abril de 2018 às 12:21:33 UTC+1, Infinity77 escreveu: >> >> Hi, >> >> On Mon, 23 Apr 2018 at 22.09, Hélio Guilherme <[email protected]> >> wrote: >> >>> Dear Experts, >>> >>> I wanted to use GIF animations to show when Test is Running or Paused on >>> my fork of Robot Framework IDE (RIDE). >>> >>> I did not find a way to attach the GIFs to the Tree Item, only managed >>> to attach them to the Tree object. >>> >>> This would be really easy to do, if SetItemImage would play animated >>> GIFs (even better if APNGs). It accepts GIFs but it does not animate. >>> >>> For the CustomTreeCtrl Item I only managed to get the X,Y for the >>> checkbox element, and then add an offset to overlap the BMP for the state >>> of the Item (it represents a Test Case). >>> >>> I recorded my application to show you my problem. See it at >>> https://youtu.be/sjthvz2Fslg >>> >>> In the recording we can see: >>> - When we scroll the Tree, the animated icon, moves accordingly - OK. >>> - When we start the animation, the initial position is always as the >>> first time the Tree is rendered - Not OK. >>> - The animation is visible even when the Item is hidden - Not OK. >>> >>> (Users will not notice these bugs if they don't scroll or >>> expand/collapse tree nodes ;) ) >>> >>> As you can also see in the code, the Destroy commands for the Animation >>> were not as effective as I would expect (or am I missing something?). >>> >>> Please give me some hints on how to get this perfect. Thanks. >>> (You are welcome to help me fixing bugs or improving the code.) >>> >>> Here is the relevant piece of code (available on branch `gificons` at >>> https://github.com/HelioGuilherme66/RIDE/blob/gificons/src/robotide/ui/tree.py >>> ): >>> >>> def _test_result(self, message): >>> wx.CallAfter(self._set_icon_from_execution_results, message.item >>> ) >>> >>> def _set_icon_from_execution_results(self, controller): >>> node = self._controller.find_node_by_controller(controller) >>> if not node: >>> return >>> # Expand the node - Nice to have >>> # root = self.GetRootItem() >>> # self.Expand(root) # node.GetParent()) >>> # self.Expand(node) >>> img_index = self._get_icon_index_for(controller) >>> # print("DEBUG setIcon img_index=%d" % (img_index)) >>> if self._animctrl: >>> self._animctrl.Stop() >>> self._animctrl.Animation.Destroy() >>> self._animctrl.Destroy() >>> self._animctrl = None >>> if img_index in (RUNNING_IMAGE_INDEX, PAUSED_IMAGE_INDEX): >>> from wx.adv import Animation, AnimationCtrl >>> import os >>> _BASE = os.path.join(os.path.dirname(__file__), '..', >>> 'widgets') >>> if img_index == RUNNING_IMAGE_INDEX: >>> img = os.path.join(_BASE, 'robot-running.gif') >>> else: >>> img = os.path.join(_BASE, 'robot-pause.gif') >>> ani = Animation(img) >>> obj = self >>> rect = (node.GetX()+20, node.GetY()+1) # DEBUG Can't get >>> item window >>> self._animctrl = AnimationCtrl(obj, -1, ani, rect) >>> self._animctrl.SetBackgroundColour(obj.GetBackgroundColour >>> ()) >>> self._animctrl.Play() >>> else: >>> self.SetItemImage(node, img_index) >>> >>> def _get_icon_index_for(self, controller): >>> if not self._execution_results: >>> return ROBOT_IMAGE_INDEX >>> if self._execution_results.is_paused(controller): >>> return PAUSED_IMAGE_INDEX >>> if self._execution_results.is_running(controller): >>> return RUNNING_IMAGE_INDEX >>> if self._execution_results.has_passed(controller): >>> return PASSED_IMAGE_INDEX >>> if self._execution_results.has_failed(controller): >>> return FAILED_IMAGE_INDEX >>> return ROBOT_IMAGE_INDEX >>> >>> >>> >> >> I see two ways to do this: >> >> 1. CustomTreeCtrl has a method called SetItemWindow, you can use it to >> associate any non-top level window to any item in the tree. In your case, >> you can assign an AnimationCtrl which will play your gifs . >> >> 2. If you can split the gif into its composing static images, you may add >> all those images to the CustomTreeCtrl wx.ImageList and then, in a timer, >> call SetItemImage on the item you wish to have your gif “played”. >> >> Andrea. >> >> >> >> >> >> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "wxPython-dev" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- You received this message because you are subscribed to the Google Groups "wxPython-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
Auto Generated Inline Image 1
(image/gif, 11.2 KB) - not displayed
Auto Generated Inline Image 2
(image/gif, 13.4 KB) - not displayed
Auto Generated Inline Image 3
(image/gif, 14.2 KB) - not displayed
Auto Generated Inline Image 4
(image/gif, 13.7 KB) - not displayed