2014-04-16 7 views
0

저는 오디오가 재생 중이거나 일시 중지되어있는 경우 여러 개의 열을 포함하는 treeview와 함께 Pixbuf를 표시하는 하나의 열을 포함하고 있습니다. 사용자가 한 행을 두 번 클릭하면 오디오 재생이 시작되고 pixbuf 아이콘을 표시하기 위해 행을 다시 렌더링해야합니다. 이 때문에 QueueDraw를 사용했지만, 커서가 현재 행을 벗어나면 작동합니다. Pixbuf를 직접 업데이트하려면 어떻게해야합니까?Treeviews QueueDraw가 현재 행을 렌더링하지 않습니까?

CODE :

protected void trvMainCuesheetRowActivated (object o, RowActivatedArgs args) 
    { 
     log.debug("trvMainCuesheetRowActivated called"); 
     TreeIter ti = TreeIter.Zero; 
     this.lsCuesheetData.GetIter(out ti,args.Path); 
     if (this.lsCuesheetData.GetValue(ti,0) != null) 
     { 
      Track tCurTrack = (Track)this.lsCuesheetData.GetValue(ti,0); 
      if (this.objProgram.getAudioManager().getPlayState() == AudioCuesheetEditor.AudioBackend.PlayState.Stopped) 
      { 
       this.objProgram.getAudioManager().play(tCurTrack); 
       this.refresh(); 
      } 
      else 
      { 
       if (this.objProgram.getAudioManager().getPlayState() == AudioCuesheetEditor.AudioBackend.PlayState.Playing) 
       { 
        this.objProgram.getAudioManager().seek(tCurTrack); 
        this.refresh(); 
       } 
      } 
     } 
    } 


private void renderPlaying(TreeViewColumn _tvcColumn, CellRenderer _crCell, TreeModel _tmModel, TreeIter _tiIter) 
    { 
     Track tCurTrack = (Track)_tmModel.GetValue (_tiIter, 0); 
     //Just display an icon, if we are playing 
     if (this.objProgram.getAudioManager().getPlayState() == AudioCuesheetEditor.AudioBackend.PlayState.Playing) 
     { 
      if (this.objProgram.getAudioManager().getCurrentlyPlayingTrack() == tCurTrack) 
      { 
       Gdk.Pixbuf icon = this.RenderIcon(Stock.MediaPlay, IconSize.SmallToolbar, null); 
       (_crCell as CellRendererPixbuf).Pixbuf = icon; 
      } 
      else 
      { 
       (_crCell as CellRendererPixbuf).Pixbuf = null; 
      } 
     } 
     else 
     { 
      if (this.objProgram.getAudioManager().getPlayState() == AudioCuesheetEditor.AudioBackend.PlayState.Paused) 
      { 
       if (this.objProgram.getAudioManager().getCurrentlyPlayingTrack() == tCurTrack) 
       { 
        Gdk.Pixbuf icon = this.RenderIcon(Stock.MediaPause, IconSize.SmallToolbar, null); 
        (_crCell as CellRendererPixbuf).Pixbuf = icon; 
       } 
       else 
       { 
        (_crCell as CellRendererPixbuf).Pixbuf = null; 
       } 
      } 
      else 
      { 
       (_crCell as CellRendererPixbuf).Pixbuf = null; 
      } 
     } 
    } 

//Purpose: Function used to refresh the MainWindow depending on new options set. 
public void refresh() 
{ 
    //QueueDraw is needed since it fires a signal to cellrenderers to update 
    this.trvMainCuesheet.QueueDraw(); 
    this.sbMainWindow.Visible = this.objProgram.getObjOption().getBShowStatusbar(); 
    this.mwToolbar.Visible = this.objProgram.getObjOption().getBToolbarVisible(); 
} 

인사말 스벤

+0

몇 가지 코드를 게시하는 마음입니까? – drahnr

+0

당신이 간다;). [link] (http://sourceforge.net/p/audiocuesheet/code/HEAD/tree/)에서 svn을 확인할 수도 있습니다. – Sven

+0

README가 없습니까? Fedora 20 x86_64에서'mdtool build AudioCuesheetEditor.sln'을 사용하여 (프로젝트 루트 나 src 디렉토리에서) 컴파일 할 때 283 개의 에러와 5 개의 경고를받습니다. 'monodevelop' IDE와 동일합니다. – drahnr

답변

0

오류 나 자신을 발견.

this.objProgram.getAudioManager().getCurrentlyPlayingTrack() 

렌더러가 올바르게 작동하도록 예상 한 위치에 트랙을 반환하지 않는 경우가있었습니다. 버그는 고쳐졌습니다, 어쨌든 고마워요;).