~onli/simdock/master

« back to all changes in this revision

Viewing changes to src/myFrame.cc

  • Committer: onli
  • Date: 2014-07-03 21:19:33 UTC
  • Revision ID: git-v1:6e7d6f18d10690bb25eb263175c2121755976f26
New Animation Engine approach
Prevent the horizontal wobblyness. Part 1, still needs to be combined with the zoom-function and to fully replace the old approach

Show diffs side-by-side

added added

removed removed

Lines of Context:
451
451
 
452
452
          sim->w = settings.ICONW;
453
453
          sim->h = settings.ICONH;
 
454
          sim->future_w = settings.ICONW;
 
455
          sim->future_h = settings.ICONH;
454
456
          sim->y =
455
457
            (settings.MAXSIZE + settings.BOTTOM_BORDER) - settings.ICONH -
456
458
            settings.BOTTOM_BORDER;
550
552
    showTooltip = false;
551
553
    OnMouseLeaveIcon(event);
552
554
    Refresh (false);
 
555
    setFutures();
 
556
    if (! animation->IsRunning()) {
 
557
        animation->Start(16);   // 60 fps
 
558
    }
553
559
}
554
560
 
555
561
void
576
582
void MyFrame::OnMouseEnterIcon (wxMouseEvent & event, simImage* img)
577
583
{
578
584
    hoveringIcon = img;
579
 
    hoveringIcon->animationStatus = STATUS_INCREASING;
580
 
    img->animationCounter = 40;
 
585
    setFutures();
581
586
    if (! animation->IsRunning()) {
582
 
        animation->Start(32);   // 30 fps
 
587
        animation->Start(16);   // 60 fps
583
588
    }
584
589
}
585
590
 
587
592
void MyFrame::OnMouseLeaveIcon (wxMouseEvent & event)
588
593
{
589
594
    hoveringIcon = None;
590
 
    if (! animation->IsRunning()) {
591
 
        animation->Start(32);   // 30 fps
592
 
    }
593
595
}
594
596
 
595
 
 
596
597
void
597
598
MyFrame::OnLeftDown (wxMouseEvent & event)
598
599
{
778
779
}
779
780
 
780
781
void MyFrame::OnAnimationTick(wxTimerEvent & event) {
781
 
    int changed = 0;
782
 
    bool changeIcons[ImagesList->GetCount()];
783
 
    fill_n(changeIcons, ImagesList->GetCount(), false);
784
 
    for (unsigned int i = 0; i < ImagesList->GetCount(); i++) {
785
 
        simImage *img = (*ImagesList)[i];
786
 
        if (img->animationStatus == STATUS_NONE) {
787
 
            continue;
788
 
        }
789
 
        if (img != hoveringIcon && img->animationStatus == STATUS_INCREASING) {
790
 
            img->animationStatus = STATUS_DECREASING;
791
 
        }
792
 
        if (img->animationStatus == STATUS_DECREASING) {
793
 
            if (img->animationCounter < 30) {
794
 
                img->animationCounter += 5;
795
 
                RefreshSizes(img, img->animationCounter);
796
 
                changed++;
797
 
                changeIcons[i] = true;
798
 
            } else {
799
 
                img->animationStatus = STATUS_NONE;
800
 
            }
801
 
        } else if (img->animationStatus == STATUS_INCREASING && img->animationCounter > 0) {
802
 
            img->animationCounter -= 5;
803
 
            RefreshSizes(img, img->animationCounter);
804
 
            changed++;
805
 
            changeIcons[i] = true;
806
 
        }
807
 
    }
808
 
    if (changed == 0) {
 
782
    cout << "animationTick \n";
 
783
    if (approachFutures()) {
809
784
        animation->Stop();
810
 
    } else {
811
 
        if (changed == 1) {
812
 
            fill_n(changeIcons, ImagesList->GetCount(), true);
813
 
        }
814
 
        PositionIcons (GetClientSize (), settings, ImagesList, changeIcons);
815
 
        Refresh (false);
816
785
    }
 
786
    Refresh(true);
817
787
}
818
788
 
819
 
 
820
 
 
821
 
 
822
 
/*
823
 
 * Changes simImage y (Not X) position and Width, Height according to the
824
 
 * mouse distance. Return TRUE if size was changed, false otherwise 
825
 
 */
 
789
// set icons width and position to the value they shall have in the future, after the animation
826
790
void
827
 
MyFrame::RefreshSizes (simImage * img, int distance)
828
 
{
829
 
  int newW = settings.ICONW;
830
 
  int newH = settings.ICONH;
831
 
 
832
 
  if (distance == 0)
833
 
    {
834
 
      newW = settings.MAXSIZE;
835
 
      newH = settings.MAXSIZE;
836
 
    }
837
 
  else
838
 
    {
839
 
      if (distance < settings.RANGE)
840
 
        {
841
 
 
842
 
          /*
843
 
           * int diff = distance * ICONW / RANGE; //(RANGE - MINIMUM);
844
 
           * newW = MAXSIZE - diff; 
845
 
           */
846
 
          newW = (int) zoom (settings.RANGE, distance, settings.MAXSIZE);
847
 
 
848
 
          if (newW < settings.ICONW)
849
 
            newW = settings.ICONW;
850
 
          newH = newW;
851
 
 
852
 
        }
853
 
    }
854
 
  if (img->w != newW)
855
 
    {
856
 
      img->y = GetClientSize ().GetHeight () - newH - settings.BOTTOM_BORDER;
857
 
      img->w = newW;
858
 
      img->h = newH;
859
 
    }
 
791
MyFrame::setFutures() {
 
792
    int neededSpace = 0;
 
793
    unsigned int imgCount = ImagesList->GetCount();
 
794
    int availableSpace = settings.LEFT_BORDER +
 
795
                            imgCount * (settings.ICONW + settings.SPACER) +
 
796
                            settings.RIGHT_BORDER - settings.SPACER;
 
797
                            
 
798
    for (unsigned int i = 0; i < imgCount; i++) {
 
799
        simImage *img = (*ImagesList)[i];
 
800
        if (img == hoveringIcon) {
 
801
            img->future_w = zoom(settings.RANGE, 0, settings.MAXSIZE);
 
802
        } else {
 
803
            img->future_w  = settings.ICONW;
 
804
        }
 
805
        img->future_h = img->future_w;
 
806
        neededSpace += img->future_w + settings.SPACER;
 
807
    }
 
808
    neededSpace -= settings.SPACER;
 
809
    double borderRatio = (double)settings.LEFT_BORDER / (settings.LEFT_BORDER + settings.RIGHT_BORDER);
 
810
    int positionX = (availableSpace - neededSpace) * borderRatio;
 
811
    
 
812
    for (unsigned int i = 0; i < imgCount; i++) {
 
813
        simImage *img = (*ImagesList)[i];
 
814
        img->future_x = positionX;
 
815
        positionX += img->future_w + settings.SPACER;
 
816
    }
 
817
}
 
818
 
 
819
 
 
820
// set icons width and position closer to their future position
 
821
// return true if everything was changed
 
822
bool
 
823
MyFrame::approachFutures() {
 
824
    unsigned int imgCount = ImagesList->GetCount();
 
825
    bool ready = true;
 
826
    int zoomChange = 1;
 
827
    for (unsigned int i = 0; i < imgCount; i++) {
 
828
        simImage *img = (*ImagesList)[i];
 
829
        if (img->w > img->future_w) {
 
830
            img->w -= zoomChange;
 
831
            ready = false;
 
832
            if (img->h > img->future_h) {
 
833
                img->y += zoomChange;
 
834
                img->h = img->w;
 
835
            }
 
836
        } else if (img->w < img->future_w) {
 
837
            img->w += zoomChange;
 
838
            ready = false;
 
839
            if (img->h < img->future_h) {
 
840
                img->y -= zoomChange;
 
841
                img->h = img->w;
 
842
            }
 
843
        }
 
844
        if (img->x > img->future_x) {
 
845
            img->x -= zoomChange;
 
846
            ready = false;
 
847
        } else if (img->x < img->future_x) {
 
848
            img->x += zoomChange;
 
849
            ready = false;
 
850
        }
 
851
    }
 
852
    return ready;
860
853
}
861
854
 
862
855
void