denemo-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Denemo-devel] Patch for handling of modes


From: Jeremiah Benham
Subject: Re: [Denemo-devel] Patch for handling of modes
Date: Thu, 4 Oct 2007 15:24:12 -0500
User-agent: Mutt/1.5.6+20040907i

On Thu, Oct 04, 2007 at 08:21:17PM +0100, Richard Shann wrote:
> them. The prefops code uses a gtk table, which makes adding new prefs
> very tedious. If no-one can suggest a good reason for this I will change
> it to a series of hboxes in a vbox.

I don't have a problem with it.
The score properties headers tab needs to be changed also. I am considering
changing it to use the function defined in scorewizard. The scorewizard's 
Header data entry is much faster. Does anyone have any objections?

Thanks for the patch.

Jeremiah



> Richard
> 

> diff -urN ../../denemo-cvs/denemo/include/denemo/denemo_types.h 
> ./include/denemo/denemo_types.h
> --- ../../denemo-cvs/denemo/include/denemo/denemo_types.h     2007-10-04 
> 19:44:40.000000000 +0100
> +++ ./include/denemo/denemo_types.h   2007-10-04 19:58:49.000000000 +0100
> @@ -89,11 +89,15 @@
>   * Enumeration for Denemo's input mode
>   */
>  typedef enum input_mode {
> -  INPUTNORMAL,
> -  INPUTREST,
> -  INPUTBLANK,
> -  REPLACE,
> -  TRAVERSE
> +#define MODE_MASK (~(RSM_OFF|RSM_OVERLAY|RSM_RHYTHM))
> +  RSM_OFF = 0, /* classic mode */
> +  RSM_OVERLAY = 1<<0, /* edit mode */
> +  RSM_RHYTHM = 1<<1, /* insert mode */
> +#define ENTRY_TYPE_MASK (~(INPUTNORMAL|INPUTREST|INPUTBLANK))
> +  INPUTNORMAL = 1<<2, /* entry type notes */
> +  INPUTREST = 1<<3, /* entry type rests */
> +  INPUTBLANK = 1<<4,/* entry type non-printing rests */
> +  TRAVERSE = 1<<5 /* read-only */
>  }input_mode;
>  
>  /**
> @@ -216,8 +220,8 @@
>  /* a pair of staffs, used to relate two staffs together */
>  typedef struct staff_info
>  {
> -  DenemoStaff *main_staff; /**< eg the bass line or the vocal part */
> -  DenemoStaff *related_staff; /**< eg the figures for the bass or the 
> lyrics*/
> +  DenemoStaff *main_staff; /* eg the bass line or the vocal part */
> +  DenemoStaff *related_staff; /* eg the figures for the bass or the lyrics*/
>  }
>  staff_info;
>  
> @@ -269,8 +273,8 @@
>    gboolean lilyentrystyle;  
>    gboolean createclones; 
>    gboolean articulation_palette; /**< This switch makes the articulation 
> pallete visable */
> -  gboolean notation_palette; /**< This switch makes the notation pallete 
> visable */
> -  gboolean rhythm_palette; /**< This option makes the rhythm pallete visable 
> */
> +  gboolean notation_palette; /**< This switch makes the notation toolbar 
> visable */
> +  gboolean rhythm_palette; /**< This option makes the rhythm toolbar visable 
> */
>    gboolean saveparts; /**< Automatically save parts*/
>    gboolean autosave; /**< Auto save data */
>    gint autosave_timeout; 
> @@ -312,13 +316,6 @@
>  
>  }LilypondHeaderInfo;
>  
> -typedef enum 
> -{
> -  RSM_OFF = 0,
> -  RSM_OVERLAY = 1<<0,
> -  RSM_RHYTHM = 1<<1
> -  
> -} RhythmicSubmode;
>  
>  typedef enum 
>  {
> @@ -464,8 +461,7 @@
>     * operation */
>    gint curmeasure_stem_directive;
>   
> -  /* support for INPUTNORMAL sub mode RHYTMIC */
> -  RhythmicSubmode rhythmicsubmode;
> +  /* support for rhythm patterns */
>    GList *rhythms;/**< list of RhythmPattern s */
>    GList *currhythm; /**< currently in use element of rhythms */
>    GList *rstep; /**< step within RhythmPattern->rsteps, the current element 
> of the current rhythm pattern */
> diff -urN ../../denemo-cvs/denemo/src/commandfuncs.c ./src/commandfuncs.c
> --- ../../denemo-cvs/denemo/src/commandfuncs.c        2007-10-04 
> 19:44:40.000000000 +0100
> +++ ./src/commandfuncs.c      2007-10-04 20:01:27.000000000 +0100
> @@ -43,7 +43,7 @@
>   * is easy to alternate rhythms.
>   */
>  void nextrhythm(DenemoGUI *gui) {
> -  if(!gui->si->rhythmicsubmode)
> +  if(!(gui->mode&(RSM_RHYTHM|RSM_OVERLAY)))
>      return;
>    if(!gui->si->rhythms)
>      return;
> @@ -456,7 +456,8 @@
>    gui->si->staffletter_y = note_value;
>    gui->si->cursor_y = jumpcursor (gui->si->cursor_y, oldstaffletter_y,
>                                 gui->si->staffletter_y);
> -  if((gui->si->rhythmicsubmode & RSM_OVERLAY) && gui->si->currentobject) {
> +  /* in RSM_OVERLAY edit the current note name */
> +  if((gui->mode & RSM_OVERLAY) && gui->si->currentobject) {
>      DenemoObject *theobj =  (DenemoObject *)(gui->si->currentobject->data);
>      if(theobj->type == CHORD && ((chord*)theobj->object)->notes) {
>        DenemoStaff *curstaff = ((DenemoStaff*)gui->si->currentstaff->data);
> @@ -468,9 +469,9 @@
>                           gui->si->curmeasurekey, gui->si->curmeasureaccs);
>      }  
>    } else
> -    /* in rhythmicsubmode we insert a note using the next step of the rhythm 
> pattern */
> +    /* in INSERT or EDIT mode we insert a note using the next step of the 
> rhythm pattern */
>  #define g  (gui->si->rstep)
> -    if(gui->si->rhythmicsubmode && g) {
> +  if((gui->mode&(RSM_RHYTHM|RSM_OVERLAY)) && g) {
>        GList *start = g;
>        GList *h;
>        do {
> @@ -495,18 +496,23 @@
>  #undef g
>  }
>  
> +
>  void
>  insert_rhythm_pattern(DenemoGUI  *gui) {
>  #define g  (gui->si->rstep)
> -  if(gui->si->rhythmicsubmode && g) {
> +  if((gui->mode&(RSM_RHYTHM|RSM_OVERLAY)) && g) {
>      GList *start = g;
>      GList *h;
>      do {
>        if(g) {
>       for(h = ((RhythmElement*)g->data)->functions;h;h=h->next) {
>         nextmeasure (gui->si, TRUE);
> -       gui->si->cursoroffend = FALSE;        
> +       gui->si->cursoroffend = FALSE;
> +       if(!code_is_a_duration(modifier_code(h->data)))
> +         cursorleft(gui);
>         ((GtkFunction)h->data)(gui);
> +       if(!code_is_a_duration(modifier_code(h->data)))
> +         cursorright(gui);
>         displayhelper(gui);
>       }
>       h = ((RhythmElement*)g->data)->functions;
> @@ -583,6 +589,12 @@
>    int prognum;
>    DenemoStaff *curstaffstruct;
>  
> +  if((mode & RSM_OVERLAY) && !si->cursor_appending) {
> +    changeduration(si, duration);
> +    return;
> +  }
> +
> +
>    /* First, check to see if the insertion'll cause the cursor to
>     * jump to the next measure. (Denemo will implicitly create it
>     * if it doesn't exist already.) */
> @@ -594,13 +606,13 @@
>  
>    /* Now actually create the chord */
>    mudela_obj_new = newchord (duration, 0, 0);
> -  if (mode == INPUTBLANK && (rest != TRUE))
> +  if ( (mode & INPUTBLANK) && (rest != TRUE))
>      {
>        addtone (mudela_obj_new, si->cursor_y,
>              si->cursoraccs[si->staffletter_y], si->cursorclef);
>        mudela_obj_new->isinvisible = TRUE;
>      }
> -  else if (mode == INPUTNORMAL && (rest != TRUE))
> +  else if ((mode & INPUTNORMAL) && (rest != TRUE))
>      addtone (mudela_obj_new, si->cursor_y, si->cursoraccs[si->staffletter_y],
>            si->cursorclef);
>  
> @@ -714,11 +726,11 @@
>  }
>  
>  /**
> - * Change a tone either in a chord or individual note
> - * alternatively remove it from a chord
> - *
> + * If REMOVE delete the note closest to si->cursor_y in a ~si->currentobject
> + * else add a tone at si->cursor_y to the ~si->currentobject
> + * FIXME ~si->currentobject in this comment means the thing gotten by the 
> macro declaremudelaobj. This macro is a horrible hack induced by trying to be 
> clever with tuplets - enforcing pairing of begin/end. tonechange 
>   * @param si pointer to the scoreinfo structure
> - * @param remove whether to remove tone or not
> + * @param remove whether to remove note or not
>   */
>  void
>  tonechange (DenemoScore * si, gboolean remove)
> diff -urN ../../denemo-cvs/denemo/src/denemoui.xml ./src/denemoui.xml
> --- ../../denemo-cvs/denemo/src/denemoui.xml  2007-10-04 19:44:40.000000000 
> +0100
> +++ ./src/denemoui.xml        2007-10-04 20:01:59.000000000 +0100
> @@ -49,11 +49,13 @@
>        <menuitem action="ToggleArticulationPalette"/>
>      </menu>
>      <menu action="EntryMenu">
> -      <menuitem action="Insert"/>
> +      <menuitem action="Classic"/>
> +      <menuitem action="TogglePitchless"/>
>        <menuitem action="Replace"/>
> +      <menuitem action="Note"/>
>        <menuitem action="Blank"/>
>        <menuitem action="Rest"/>
> -      <menuitem action="Default"/>
> +      <menuitem action="ReadOnly"/>
>        <menuitem action="ToggleRhythmToolbar"/>
>  
>      </menu>
> @@ -160,7 +162,7 @@
>    </toolbar>
>    <toolbar name="RhythmToolBar">
>        <toolitem action="TogglePitchRecognition"/>
> -    <toolitem action="TogglePitchless"/>
> +
>      <toolitem action="CreateRhythm"/>
>      <toolitem action="DeleteRhythm"/>
>    </toolbar>
> diff -urN ../../denemo-cvs/denemo/src/drawcursor.c ./src/drawcursor.c
> --- ../../denemo-cvs/denemo/src/drawcursor.c  2007-01-24 19:44:26.000000000 
> +0000
> +++ ./src/drawcursor.c        2007-10-04 20:09:17.000000000 +0100
> @@ -42,9 +42,9 @@
>        purplegc = gcs_purplegc ();
>      }
>  
> -  paintgc = (mode == INPUTREST) ? graygc :
> -    (mode == INPUTBLANK) ? bluegc :
> -    (mode == REPLACE) ? purplegc : si->cursoroffend ? redgc : greengc;
> +  paintgc = (mode & INPUTREST) ? graygc :
> +    (mode & INPUTBLANK) ? bluegc :
> +    (mode & RSM_OVERLAY) ? purplegc : si->cursoroffend ? redgc : greengc;
>    gdk_draw_rectangle (pixmap, paintgc, TRUE, xx, height + y - CURSOR_MINUS,
>                     CURSOR_WIDTH, CURSOR_HEIGHT);
>  
> diff -urN ../../denemo-cvs/denemo/src/keyresponses.c ./src/keyresponses.c
> --- ../../denemo-cvs/denemo/src/keyresponses.c        2007-10-04 
> 19:44:40.000000000 +0100
> +++ ./src/keyresponses.c      2007-10-04 20:10:41.000000000 +0100
> @@ -37,9 +37,9 @@
>                              event->state)))
>      {
>  
> -  /* in rhythmicsubmode when a duration is entered set up a singleton rhythm 
> pattern that
> +  /* in rhythmic mode when a duration is entered set up a singleton rhythm 
> pattern that
>       is just this one duration */
> -#define RSM (gui->si->rhythmicsubmode)
> +#define RSM (gui->mode)
>        if((RSM & RSM_RHYTHM ) && !(RSM & RSM_OVERLAY))
>      if( ki->func.nocallback==(gpointer)insert_chord_0key ||
>       ki->func.nocallback==(gpointer)insert_chord_1key ||
> @@ -194,10 +194,10 @@
>  void
>  octave_up_key (DenemoGUI * gui)
>  {
> -  if(gui->si->rhythmicsubmode)
> +  if(gui->mode&(RSM_RHYTHM|RSM_OVERLAY))
>      tonechange(gui->si, TRUE);
>    gui->si->cursor_y += 7;
> -  if(gui->si->rhythmicsubmode)
> +  if(gui->mode&(RSM_RHYTHM|RSM_OVERLAY))
>      tonechange(gui->si, FALSE);
>  }
>  
> @@ -207,10 +207,10 @@
>  void
>  octave_down_key (DenemoGUI * gui)
>  {
> -  if(gui->si->rhythmicsubmode)
> +  if(gui->mode&(RSM_RHYTHM|RSM_OVERLAY))
>      tonechange(gui->si, TRUE);
>    gui->si->cursor_y -= 7;
> -  if(gui->si->rhythmicsubmode)
> +  if(gui->mode&(RSM_RHYTHM|RSM_OVERLAY))
>      tonechange(gui->si, FALSE);
>  }
>  
> @@ -230,49 +230,11 @@
>  
>  }
>  
> -/**
> - * Change to insert mode
> - *
> - */
> -void
> -insert_mode (GtkAction * action, DenemoGUI * gui)
> -{
> -  if (gui->mode != INPUTNORMAL)
> -    gui->mode = INPUTNORMAL;
> -  gtk_statusbar_push (GTK_STATUSBAR (gui->statusbar), gui->status_context_id,
> -                   "Insert");
> -  displayhelper (gui);
> -}
>  
> -/**
> - * Change to replace mode
> - * 
> - */
> -void
> -replace_mode (GtkAction * action, DenemoGUI * gui)
> -{
> -  if (gui->mode != REPLACE)
> -    gui->mode = REPLACE;
> -  gtk_statusbar_push (GTK_STATUSBAR (gui->statusbar), gui->status_context_id,
> -                   "Replace");
> -  displayhelper (gui);
> -}
>  
> -/**
> - * Change to blank mode i.e. insert invisible notes
> - */
> -void
> -blank_mode (GtkAction * action, DenemoGUI * gui)
> -{
> -  if (gui->mode != INPUTBLANK)
> -    gui->mode = INPUTBLANK;
> -  gtk_statusbar_push (GTK_STATUSBAR (gui->statusbar), gui->status_context_id,
> -                   "Blank");
> -  displayhelper (gui);
> -}
>  
>  /**
> - * Toggle into rest mode
> + * Toggle into rest mode FIXME bitfields!!!!
>   * 
>   */
>  void
> @@ -286,7 +248,7 @@
>  }
>  
>  /**
> - * Toggle blank mode
> + * Toggle blank mode FIXME bitfields!!!
>   *
>   */
>  void
> @@ -329,9 +291,7 @@
>  void
>  insert_chord_0key (DenemoGUI * gui)
>  {
> -  if (gui->mode == REPLACE)
> -    change_pitch (gui);
> -  else if (gui->mode == INPUTNORMAL || gui->mode == INPUTREST)
> +
>      dnm_insertchord (gui->si, 0, gui->mode, FALSE);
>  
>  }
> @@ -339,54 +299,42 @@
>  void
>  insert_chord_1key (DenemoGUI * gui)
>  {
> -  if (gui->mode == REPLACE)
> -    change_pitch (gui);
> -  else if (gui->mode == INPUTNORMAL || gui->mode == INPUTREST)
> +
>      dnm_insertchord (gui->si, 1, gui->mode, FALSE);
>  }
>  
>  void
>  insert_chord_2key (DenemoGUI * gui)
>  {
> -  if (gui->mode == REPLACE)
> -    change_pitch (gui);
> -  else if (gui->mode == INPUTNORMAL || gui->mode == INPUTREST)
> +
>      dnm_insertchord (gui->si, 2, gui->mode, FALSE);
>  }
>  
>  void
>  insert_chord_3key (DenemoGUI * gui)
>  {
> -  if (gui->mode == REPLACE)
> -    change_pitch (gui);
> -  else if (gui->mode == INPUTNORMAL || gui->mode == INPUTREST)
> +
>      dnm_insertchord (gui->si, 3, gui->mode, FALSE);
>  }
>  
>  void
>  insert_chord_4key (DenemoGUI * gui)
>  {
> -  if (gui->mode == REPLACE)
> -    change_pitch (gui);
> -  else if (gui->mode == INPUTNORMAL || gui->mode == INPUTREST)
> +
>      dnm_insertchord (gui->si, 4, gui->mode, FALSE);
>  }
>  
>  void
>  insert_chord_5key (DenemoGUI * gui)
>  {
> -  if (gui->mode == REPLACE)
> -    change_pitch (gui);
> -  else if (gui->mode == INPUTNORMAL || gui->mode == INPUTREST)
> +
>      dnm_insertchord (gui->si, 5, gui->mode, FALSE);
>  }
>  
>  void
>  insert_chord_6key (DenemoGUI * gui)
>  {
> -  if (gui->mode == REPLACE)
> -    change_pitch (gui);
> -  else if (gui->mode == INPUTNORMAL || gui->mode == INPUTREST)
> +
>      dnm_insertchord (gui->si, 6, gui->mode, FALSE);
>  }
>  
> @@ -581,7 +529,7 @@
>      }
>    /* if you are following a rhythmic pattern then backup the pattern */
>  #define g  (gui->si->rstep)
> -  if(gui->si->rhythmicsubmode && g) 
> +  if((gui->mode&(RSM_RHYTHM|RSM_OVERLAY)) && g) 
>      {
>  #define CURRP ((RhythmPattern *)gui->si->currhythm->data) 
>        g = g->prev; /* list is circular - should we stop at beginning? */
> @@ -885,7 +833,7 @@
>  void
>  change_pitch (DenemoGUI * gui)
>  {
> -  if (gui->mode == REPLACE)
> +  if (gui->mode & RSM_OVERLAY)
>      {
>        //DenemoObject *theobj =
>        //  si->currentobject ? (DenemoObject *) si->currentobject->data : 
> NULL;
> diff -urN ../../denemo-cvs/denemo/src/pitchentry.c ./src/pitchentry.c
> --- ../../denemo-cvs/denemo/src/pitchentry.c  2007-10-04 19:44:40.000000000 
> +0100
> +++ ./src/pitchentry.c        2007-10-04 20:12:03.000000000 +0100
> @@ -302,18 +302,16 @@
>    store  = (curstaff->tone_store);
>    measurenode *curmeasure = curstaff->measures;
>    GList *store_el = NULL;
> -
> +  // move cursor to start of current measure
> +  si->currentobject = (objnode *) si->currentmeasure->data;
> +  si->cursor_x = 0;
> +  si->cursor_appending = !(gboolean)si->currentobject;
> +  //calcmarkboundaries (si);
>    measurenum =  si->currentmeasurenum - 1;
>    curmeasure = si->currentmeasure;
>    if(curmeasure) {
>      store_el = get_tones(store, measurenum);
>      objnode *curobj = curmeasure->data;
> -
> -    // start at currentobject
> -    while(curobj!=si->currentobject)
> -      curobj = curobj->next;
> -     
> -
>      while (curobj)
>        {
>       tone* thetone;
> @@ -333,7 +331,10 @@
>           ((chord*)theobj->object)->tone_node = store_el;
>           modify_note((chord*)theobj->object, mid_c_offset, thetone->enshift, 
> dclef);
>           tone_stored=TRUE;
> +         if(!si->cursor_appending)
> +           cursorright(PR_gui);
>           store_el = store_el->next;
> +
>         }// tone available
>       }// note available
>       /* skip over non notes */
> @@ -341,15 +342,10 @@
>         curobj = curobj->next;
>         if(curobj)
>           theobj = (DenemoObject *) curobj->data;
> -     }
> -     while(curobj && (theobj->type != CHORD || 
> ((chord*)theobj->object)->notes==NULL));
> -       
> -
> +     } while(curobj && 
> +             (theobj->type != CHORD || 
> ((chord*)theobj->object)->notes==NULL));
>       if(tone_stored && curobj==NULL && curmeasure->next)
>        ret = TRUE;
> -
> -
> -
>        }// while objects in measure
>      if(store_el && !PR_continuous) 
>        sound_click();//extra tones in measure
> @@ -403,19 +399,13 @@
>    thetone->octave = octave;
>    thetone->valid = TRUE;
>  #define store  (((DenemoStaff*)gui->si->currentstaff->data)->tone_store)
> -  /* if this measure has tones, but not on the currentobject then clear the 
> tones, otherwise
> -     the one being stored will not apply to the currentobject */
> -  if(gui->si->currentobject && !((chord*)((DenemoObject 
> *)gui->si->currentobject->data)->object)->tone_node && store && 
> g_list_nth(store,gui->si->currentmeasurenum - 1)  && 
> g_list_nth(store,gui->si->currentmeasurenum - 1)->data)
> -    clear_tones_currentmeasure(NULL, gui); 
>    store = put_tone(store, gui->si->currentmeasurenum - 1, thetone);
>    nextmeasure = apply_tones(gui->si);
>    displayhelper (gui);
>    if(PR_continuous && nextmeasure) {
>      sound_click();
>      measureright(gui);
> -  }
> -  
> -  /* gtk_widget_draw(gui->scorearea, NULL); */
> +  }  
>  #undef store
>  }
>  
> @@ -425,7 +415,6 @@
>  static void clear_tone_nodes(DenemoGUI *gui ) {
>    DenemoScore *si = gui->si;
>    DenemoStaff* curstaff = ((DenemoStaff*)si->currentstaff->data);
> -
>    measurenode *curmeasure;
>    for (curmeasure = curstaff->measures;curmeasure; curmeasure = 
> curmeasure->next) {
>      objnode *curobj = curmeasure->data;
> @@ -455,6 +444,7 @@
>    store = NULL;
>  #undef store
>    displayhelper(gui);
> +  switch_back_to_main_window();
>  }
>  
>  /*
> @@ -489,23 +479,16 @@
>    GList *tone_node = thechord->tone_node;
>    if(tone_node) {
>      ((tone*)tone_node->data)->valid = FALSE;
> -    thechord->tone_node = NULL;
> -    /* move cursor back to where tone overlay starts, so that the overlay is 
> placed on the same notes as before */
> -  gint leftshifts = 0;
> -  while(si->currentobject->prev) {
> -    cursorleft(PR_gui);
> -    leftshifts++;
> -    DenemoObject *theobj = (DenemoObject *)si->currentobject->data;
> -    if((theobj->type == CHORD) && (((chord*)theobj->object)->notes!=NULL) && 
> (((chord*)theobj->object)->tone_node == NULL)) {
> -      cursorright(PR_gui);
> -      leftshifts--;
> -      break;
> -    }
> -  }
> +  objnode *keep = si->currentobject;
> +  gint keepx = si->cursor_x;
> +  gboolean keepa = si->cursor_appending;
>    apply_tones(si);
>    /*restore the position of the cursor before the delete of the tone */
> -  while(leftshifts--)
> -    cursorright(PR_gui);
> +  si->currentobject = keep;
> +  si->cursor_x = keepx;
> +  si->cursor_appending = keepa;
> +  calcmarkboundaries (si);
> +
>    displayhelper (PR_gui);
>    return TRUE;
>    } else {
> @@ -726,10 +709,11 @@
>    switch_back_to_main_window();
>  }
>  
> -
> -static void toggle_insert(GtkButton *button) {
> -  // switch the button to read Collect Notes/Insert Notes
> -  // toggle PR_insert to show where the notes detected should go
> +  // toggle PR_insert to show where the notes detected should go, and start 
> correct entry mode
> +static void toggle_insert(GtkButton *button, DenemoGUI *gui) {
> +  GtkAction *action;
> +  action = gtk_ui_manager_get_action (gui->ui_manager, 
> PR_insert?"/MainMenu/EntryMenu/TogglePitchless": 
> "/MainMenu/EntryMenu/Replace");
> +  gtk_action_activate(action);
>    PR_insert = !PR_insert;
>    switch_back_to_main_window();
>  }
> @@ -773,7 +757,7 @@
>    gtk_box_pack_start (GTK_BOX (hbox2), radio_button,
>                     TRUE, TRUE, 0);
>    g_signal_connect (G_OBJECT (radio_button), "toggled",
> -                 G_CALLBACK (toggle_insert), NULL);
> +                 G_CALLBACK (toggle_insert), gui);
>  
>    button = gtk_button_new_with_label("Clear");
>    gtk_box_pack_start (GTK_BOX (hbox2), button,
> @@ -801,10 +785,6 @@
>    gtk_box_pack_start (GTK_BOX (hbox2), spinner, TRUE, TRUE, 0);
>    g_signal_connect (G_OBJECT (spinner), "value-changed",
>                   G_CALLBACK (change_click_volume), NULL);
> -
> -
> -
> -
>    button = 
> gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_button), 
> "Insert Notes");
>    gtk_box_pack_start (GTK_BOX (hbox), button,
>                     TRUE, TRUE, 0);/* no need for callback */
> diff -urN ../../denemo-cvs/denemo/src/prefdialog.c ./src/prefdialog.c
> --- ../../denemo-cvs/denemo/src/prefdialog.c  2007-01-24 19:44:26.000000000 
> +0000
> +++ ./src/prefdialog.c        2007-10-04 20:02:44.000000000 +0100
> @@ -30,6 +30,7 @@
>    GtkWidget *checkclone;
>    GtkWidget *checkautosave;
>    GtkWidget *checknotationpalette;
> +  GtkWidget *checkrhythmpalette;
>    GtkWidget *checkarticulationpalette;
>    GtkWidget *autosaveentry;
>    GtkWidget *browserentry;
> @@ -133,6 +134,9 @@
>    prefs->notation_palette =
>      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
>                                 (cbdata->checknotationpalette));
> +  prefs->rhythm_palette =
> +    gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
> +                               (cbdata->checkrhythmpalette));
>    prefs->saveparts =
>       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
>                                 (cbdata->checkautosaveparts));
> @@ -161,6 +165,7 @@
>    GtkWidget *texteditor;
>    GtkWidget *denemopath;
>    GtkWidget *checknotationpalette;
> +  GtkWidget *checkrhythmpalette;
>    GtkWidget *checkarticulationpalette;
>    GtkWidget *notebook;
>    GtkWidget *hbox;
> @@ -191,7 +196,7 @@
>    /*
>     * Note entry settings
>     */
> -  table = gtk_table_new (9, 2, FALSE);
> +  table = gtk_table_new (13, 2, FALSE);
>    gtk_container_set_border_width (GTK_CONTAINER (table), 12);
>    gtk_table_set_row_spacings (GTK_TABLE (table), 8);
>    gtk_table_set_col_spacings (GTK_TABLE (table), 8);
> @@ -230,7 +235,7 @@
>                   (GtkAttachOptions) (0), 0, 0);
>  
>    checknotationpalette =
> -    gtk_check_button_new_with_label (_("Display notataion toolbar"));
> +    gtk_check_button_new_with_label (_("Display durations toolbar"));
>    gtk_widget_set_sensitive (checknotationpalette, TRUE);
>    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checknotationpalette),
>                               gui->prefs->notation_palette);
> @@ -247,8 +252,22 @@
>                   (GtkAttachOptions) (GTK_FILL),
>                   (GtkAttachOptions) (0), 0, 0);
>  
> +
> +  checkrhythmpalette =
> +    gtk_check_button_new_with_label (_("Display rhythm pattern toolbar"));
> +  gtk_widget_set_sensitive (checkrhythmpalette, TRUE);
> +  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkrhythmpalette),
> +                             gui->prefs->rhythm_palette);
> +  gtk_table_attach (GTK_TABLE (table), checkrhythmpalette, 0, 2, 8, 9,
> +                 (GtkAttachOptions) (GTK_FILL),
> +                 (GtkAttachOptions) (0), 0, 0);
> +
> +
> +
> +
> +
>    hbox = gtk_hbox_new (FALSE, 8);
> -  gtk_table_attach (GTK_TABLE (table), hbox, 0, 2, 7, 8,
> +  gtk_table_attach (GTK_TABLE (table), hbox, 0, 2, 10, 11,
>                   (GtkAttachOptions) (GTK_FILL),
>                   (GtkAttachOptions) (0), 0, 0);
>  
> @@ -273,7 +292,7 @@
>    gtk_widget_set_sensitive (checkarticulationpalette, FALSE);
>     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkautosaveparts),
>                               gui->prefs->saveparts);
> -  gtk_table_attach(GTK_TABLE(table), checkautosaveparts, 0,2, 8,9,
> +  gtk_table_attach(GTK_TABLE(table), checkautosaveparts, 0,2, 11,12,
>                                  (GtkAttachOptions) (GTK_FILL),
>                                  (GtkAttachOptions) (0), 0,0);
>    /*
> @@ -440,6 +459,7 @@
>    cbdata.checkautosaveparts = checkautosaveparts;
>    cbdata.checkarticulationpalette = checkarticulationpalette;
>    cbdata.checknotationpalette = checknotationpalette;
> +  cbdata.checkrhythmpalette = checkrhythmpalette;
>    cbdata.checkclone = checkclone;
>    cbdata.checkautosave = checkautosave;
>    cbdata.autosaveentry = autosaveentry;
> diff -urN ../../denemo-cvs/denemo/src/prefops.c ./src/prefops.c
> --- ../../denemo-cvs/denemo/src/prefops.c     2007-08-22 10:50:05.000000000 
> +0100
> +++ ./src/prefops.c   2007-10-04 20:03:13.000000000 +0100
> @@ -111,8 +111,9 @@
>    ret->createclones = FALSE;
>    ret->autosave = TRUE;
>    ret->autosave_timeout = 5;
> -  ret->notation_palette = FALSE;
> -  ret->articulation_palette = FALSE;
> +  ret->notation_palette = TRUE;
> +  ret->articulation_palette = TRUE;
> +  ret->rhythm_palette = TRUE;
>    ret->history = g_queue_new ();
>  
>    /* Read values from systemwide preferences file */
> @@ -332,6 +333,16 @@
>             xmlFree (tmp);
>           }
>       }
> +      else if (0 ==
> +            xmlStrcmp (cur->name, (const xmlChar *) "rhythmpalette"))
> +     {
> +       xmlChar *tmp = xmlNodeListGetString (doc, cur->xmlChildrenNode, 1);
> +       if(tmp)
> +         {
> +           prefs->rhythm_palette = atoi ((gchar *) tmp);
> +           xmlFree (tmp);
> +         }
> +     }
>        else if (0 == xmlStrcmp (cur->name, (const xmlChar *) "lilyversion"))
>       {
>         xmlChar *tmp = xmlNodeListGetString (doc, cur->xmlChildrenNode, 1);
> @@ -556,6 +567,8 @@
>                 prefs->notation_palette);
>    newXMLIntChild (child, (xmlChar *) "articulationpalette",
>                 prefs->articulation_palette);
> +  newXMLIntChild (child, (xmlChar *) "rhythmpalette",
> +               prefs->rhythm_palette);
>    if (prefs->browser)
>      xmlNewChild (child, NULL, (xmlChar *) "browser",
>                (xmlChar *) prefs->browser->str);
> diff -urN ../../denemo-cvs/denemo/src/view.c ./src/view.c
> --- ../../denemo-cvs/denemo/src/view.c        2007-10-04 19:44:40.000000000 
> +0100
> +++ ./src/view.c      2007-10-04 20:08:18.000000000 +0100
> @@ -92,7 +92,7 @@
>  {
>    GList *display = NULL;
>  
> -
> +  stop_pitch_recognition();
>    DenemoScore *si = gui->si;
>    //Iterate through the views list if more than one is open
>    if (g_list_length (displays) > 1)
> @@ -336,7 +336,7 @@
>    r->gui->si->currhythm = g_list_find(r->gui->si->rhythms, r);
>    r->gui->si->rstep = r->rsteps;
>  #define g (r->gui->si->rstep)
> -#define RSM (r->gui->si->rhythmicsubmode)
> +#define RSM (r->gui->mode)
>    if(((RhythmElement*)g->data)->icon) {
>      GtkWidget *label = LABEL(CURRP->button);
>      gtk_label_set_markup(GTK_LABEL(label),((RhythmElement*)g->data)->icon);
> @@ -368,7 +368,7 @@
>   * return an ascii code to indicate what modifier (if any) function gives.
>   * '0x0' means not a valid modifier for a rhythmic duration
>   * char '.' means a dotted note, '(' and ')' mean start and end slur
> - * r to x are rests
> + * r to z are rests
>   * others to be defined
>   * 
>   */
> @@ -387,6 +387,9 @@
>      fn==(gpointer)insert_rest_6key ? 'x':0;
>  }
>  
> +gboolean code_is_a_duration(gchar code) {
> +  return code==0 || (code>='r' && code<='z');
> +}
>  
>  /**
>   * Callback to translate keypresses into rhythm elements
> @@ -618,7 +621,7 @@
>  delete_rhythm_cb (GtkAction * action, DenemoGUI * gui)
>  {
>  
> -  if(gui->si->rhythmicsubmode == RSM_OFF)
> +  if(gui->mode&(RSM_RHYTHM|RSM_OVERLAY) == 0)
>      return;
>    if(gui->si->currhythm==NULL)
>      return;
> @@ -713,13 +716,11 @@
>     "List Available Plugins", G_CALLBACK (list_available_plugins)},
>    {"ViewMenu", NULL, N_("_View")},
>    {"EntryMenu", NULL, N_("Mo_de")},
> -  {"Insert", NULL, N_("_Insert"), "Insert", "Insert Mode",
> -   G_CALLBACK (insert_mode)},
> -  {"Replace", NULL, N_("_Replace"), NULL, "Replace Mode",
> -   G_CALLBACK (replace_mode)},
> -  {"Blank", NULL, N_("_Blank"), NULL, "Blank Mode", G_CALLBACK (blank_mode)},
> -  {"Rest", NULL, N_("_Rest"), "r", "Rest Mode", G_CALLBACK 
> (rest_toggle_key)},
> -  {"Default", NULL, N_("_Default"), "Escape", "Default Mode",
> +
> +
> +
> +
> +  {"ReadOnly", NULL, N_("Read Only"), NULL, "Read only Mode",
>     G_CALLBACK (default_mode)},
>    {"StaffMenu", NULL, N_("_Staff")},
>    {"AddBefore", NULL, N_("Add _Before Current Staff..."), NULL, NULL,
> @@ -886,13 +887,53 @@
>  }
>  
>  /**
> - *  Function to toggle entry of rhythms without pitches 
> + *  callback changing mode  gui->mode
> + *
> + */
> +static void
> +change_mode (GtkRadioAction * action, GtkRadioAction * current, DenemoGUI * 
> gui) {
> +gint val = gtk_radio_action_get_current_value (action);
> + switch(val) {
> +#define SET_MODE(m)  (gui->mode=((gui->mode&MODE_MASK)|m))
> + case RSM_OFF:
> +   SET_MODE(RSM_OFF);
> +   break;
> + case RSM_RHYTHM:
> +   SET_MODE(RSM_RHYTHM);
> +   break;
> + case RSM_OVERLAY:
> +   SET_MODE(RSM_RHYTHM|RSM_OVERLAY);
> +   break;
> +#undef SET_MODE
> + }
> + //g_print("Mode is %x for val=%x for %p %p other is %x\n", gui->mode, val, 
> action, current, gtk_radio_action_get_current_value (current));
> +}
> +
> +
> +/**
> + *  callback changing type of entry
>   *
>   */
>  static void
> -toggle_pitchless (GtkAction * dummy, DenemoGUI * gui) {
> -  gui->si->rhythmicsubmode ^= RSM_OVERLAY;
> +change_entry_type (GtkRadioAction * action, GtkRadioAction * current, 
> DenemoGUI * gui) {
> +gint val = gtk_radio_action_get_current_value (action);
> + switch(val) {
> +#define SET_MODE(m)  (gui->mode=((gui->mode&ENTRY_TYPE_MASK)|m))
> + case INPUTREST:
> +   SET_MODE(INPUTREST);
> +   break;
> + case INPUTNORMAL:
> +   SET_MODE(INPUTNORMAL);
> +   break;
> + case INPUTBLANK:
> +   SET_MODE(INPUTBLANK);
> +   break;
> + }
> +#undef SET_MODE
> + //g_print("Mode is %x masks %x %x\n",ENTRY_TYPE_MASK, MODE_MASK, gui->mode);
>  }
> +
> +
>  /**
>   *  Function to toggle entry of notes by pitch recognition off/on 
>   *
> @@ -914,27 +955,31 @@
>        }
>    }
>    /* then turn on/off */
> + 
>    if(gui->pitch_recognition) {
>      stop_pitch_recognition();
>    } else {
>      start_pitch_recognition(gui);// FIXME different guis
> +  
> +  
>    }
>    gui->pitch_recognition =  !gui->pitch_recognition;
>    /* always turn rhythm mode on with pitch recognition, since otherwise the
>       cursor just bobs about uselessly, while the accidentals in the notes 
> affect
>       the previous note */
> -
> -  GtkWidget *widget = gtk_ui_manager_get_widget (gui->ui_manager, 
> "/MainMenu/EntryMenu/ToggleRhythmToolbar");
> -  GtkWidget *toolbar = gtk_ui_manager_get_widget (gui->ui_manager, 
> "/RhythmToolBar");
> -  if (!GTK_WIDGET_VISIBLE (toolbar))
> -    g_signal_emit_by_name(widget, "activate", action, gui);
> -
> +  GtkAction *mode = gtk_ui_manager_get_action (gui->ui_manager, 
> gui->pitch_recognition?"/MainMenu/EntryMenu/Replace": 
> "/MainMenu/EntryMenu/TogglePitchless");
> +  //g_print("PRIOR The %s action is %p is 
> sen\n",gui->pitch_recognition?"/MainMenu/EntryMenu/Replace": 
> "/MainMenu/EntryMenu/TogglePitchless", mode, gtk_action_get_sensitive(mode) );
> +  gtk_action_activate(mode);
> + // g_print("The %s action is %p 
> \n",gui->pitch_recognition?"/MainMenu/EntryMenu/Replace": 
> "/MainMenu/EntryMenu/TogglePitchless", mode);
> +mode = gtk_ui_manager_get_action (gui->ui_manager, 
> "/MainMenu/EntryMenu/Note");
> +  gtk_action_activate(mode);
> + // g_print("Note action is %p is sensitive %x\n", mode, 
> gtk_action_get_sensitive(mode));
>  }
>  
>  
>  /**
>   *  Function to toggle whether rhythm toolbar is visible 
> - *  Sets the rhythmic submode, and turns off pitchless entry if it is being 
> hidden.
> + *  switches keymap to Rhythm.keymaprc when toolbar is on back to standard 
> when off.
>   *  
>   */
>  static void
> @@ -943,28 +988,27 @@
>    static keymap *rhythm_keymap;// special keymap in rhythm submode
>    GtkWidget *widget;
>    widget = gtk_ui_manager_get_widget (gui->ui_manager, "/RhythmToolBar");
> + // g_print("Callback for %s\n", g_type_name(G_TYPE_FROM_INSTANCE(widget)));
>    if (GTK_WIDGET_VISIBLE (widget))
>      {
> -      if(gui->si->rhythmicsubmode & RSM_OVERLAY) {
> -     GtkAction *tog = gtk_ui_manager_get_action (gui->ui_manager, 
> "/RhythmToolBar/TogglePitchless");
> -/*   g_print("type is %s\n", g_type_name(G_TYPE_FROM_INSTANCE(tog))); */
> -     g_signal_emit_by_name(tog, "activate", NULL, gui);
> -      }
>        if(gui->prefs->standard_keymap)
>       gui->prefs->the_keymap = gui->prefs->standard_keymap;
> -      gui->si->rhythmicsubmode = RSM_OFF;
>        gtk_widget_hide (widget);
>      }
>    else
>      {
>        if(rhythm_keymap==NULL){
> -     
>       rhythm_keymap = create_keymap ("Rhythm.keymaprc");
>       //printf("CREATED keymap\n");
>        }
>        gui->prefs->the_keymap = rhythm_keymap;
>        gtk_widget_show (widget);
> -      gui->si->rhythmicsubmode |= (RSM_RHYTHM);
> +#if 0
> +      GtkAction *mode = gtk_ui_manager_get_action (gui->ui_manager, 
> "/MainMenu/EntryMenu/Replace");
> +#else
> +      GtkAction *mode = gtk_ui_manager_get_action (gui->ui_manager, 
> "/MainMenu/EntryMenu/Note");
> +#endif
> +      gtk_action_activate(mode);//FIXME does not work
>      }
>  }
>  
> @@ -975,7 +1019,7 @@
>    {"ToggleNotationToolbar", NULL, N_("_Durations Toolbar"), NULL, N_("Enter 
> single notes/rests of a given duration"),
>     G_CALLBACK (toggle_notation_toolbar), FALSE}
>    ,
> -  {"ToggleRhythmToolbar", NULL, N_("_Rhythmic & Overlays"), NULL, N_("Enter 
> notes using a prevailing rhythm\nOverlay with pitches"),
> +  {"ToggleRhythmToolbar", NULL, N_("Rhythms & Overlays"), NULL, N_("Enter 
> notes using a prevailing rhythm\nOverlay with pitches"),
>     G_CALLBACK (toggle_rhythm_toolbar), FALSE}
>    ,
>    {"TogglePitchRecognition", NULL, N_("_Microphone"), NULL, N_("Enable pitch 
> entry from microphone"),
> @@ -983,12 +1027,29 @@
>    ,
>    {"ToggleArticulationPalette", NULL, N_("_Articulation Palette"), NULL, 
> NULL,
>     G_CALLBACK (toggle_articulation_palette), FALSE}
> -  ,
> -  {"TogglePitchless", NULL, N_("_Overlay"), NULL, N_("Pure rhythm entry\nAnd 
> overlay notes with pitches"),
> -   G_CALLBACK (toggle_pitchless), FALSE}
> +
>  
>  };
>  
> +/**
> + * Radio entries for the menus
> + */
> +static GtkRadioActionEntry radio_menu_entries[] = {
> +  {"Classic", NULL, N_("Classic"), NULL, "Denemo Classic  note entry mode",
> +   RSM_OFF},
> +  {"Replace", NULL, N_("Insert"), NULL, N_("Insert notes"),
> +   RSM_RHYTHM},
> +  {"TogglePitchless", NULL, N_("Edit"), NULL, N_("Edit notes/Enter pure 
> rhythms"),
> +   RSM_OVERLAY}
> +
> +};
> +
> +
> +static GtkRadioActionEntry type_menu_entries[] = {
> +  {"Note", NULL, N_("Note"), NULL,  N_("Normal Mode"), INPUTNORMAL},
> +  {"Rest", NULL, N_("Rest"), NULL,  N_("Rest Mode"), INPUTREST},
> +  {"Blank", NULL, N_("Non printing rests"), NULL,  N_("Ghost rests"), 
> INPUTBLANK}
> +};
>  
>  struct cbdata
>  {
> @@ -1004,7 +1065,7 @@
>  openrecent (GtkWidget * widget, gpointer data)
>  {
>    struct cbdata *cdata = (struct cbdata *) data;
> -  g_print ("actioned\n");
> + // g_print ("actioned\n");
>    open_for_real (cdata->filename, cdata->gui);
>  
>  }
> @@ -1112,6 +1173,22 @@
>                                      toggle_menu_entries,
>                                      G_N_ELEMENTS (toggle_menu_entries),
>                                      gui);
> +  gtk_action_group_add_radio_actions (action_group,
> +                                    radio_menu_entries,
> +                                    G_N_ELEMENTS (radio_menu_entries),
> +                                   RSM_RHYTHM/* initial value */, 
> +                                   G_CALLBACK(change_mode), gui);
> +
> +
> +  gtk_action_group_add_radio_actions (action_group,
> +                                    type_menu_entries,
> +                                    G_N_ELEMENTS (type_menu_entries),
> +                                   INPUTNORMAL/* initial value */, 
> +                                   G_CALLBACK(change_entry_type), gui);
> +
> +  
> +
> +
>    ui_manager = gtk_ui_manager_new ();
>    gui->ui_manager = ui_manager;
>    gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
> @@ -1119,7 +1196,7 @@
>    gtk_window_add_accel_group (GTK_WINDOW (gui->window), accel_group);
>  
>    data_dir = g_build_filename (
> -#ifndef USE_LOCAL_DENEMOUI
> +#ifdef USE_LOCAL_DENEMOUI
>  get_data_dir (),
>  #endif
>   "denemoui.xml", NULL);
> @@ -1147,7 +1224,7 @@
>    GTK_WIDGET_UNSET_FLAGS(toolbar, GTK_CAN_FOCUS);
>    gtk_widget_show (toolbar);
>    toolbar = gtk_ui_manager_get_widget (ui_manager, "/EntryToolBar");
> -  g_print("EntryToolbar is %p\n", toolbar);
> +  //g_print("EntryToolbar is %p\n", toolbar);
>    gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
>    gtk_box_pack_start (GTK_BOX (main_vbox), toolbar, FALSE, TRUE, 0);
>    GTK_WIDGET_UNSET_FLAGS(toolbar, GTK_CAN_FOCUS);
> @@ -1230,24 +1307,37 @@
>  
>    /* Now that the window's shown, initialize the gcs */
>    gcs_init (gui->window->window);
> -  if (gui->prefs->articulation_palette)
> -    toggle_articulation_palette (NULL, gui);
> -  toggle_rhythm_toolbar (NULL, gui);
>  
> -  if (!gui->prefs->notation_palette)
> -    {
> -      g_print ("Notation palette %d\n", gui->prefs->notation_palette);
> -      toggle_notation_toolbar (NULL, gui);
> -    }
>    /* Similarly, the keymap should be initialized after the
>       only once si->window is shown, as it may pop up an advisory
>       dialog. */
>    gui->prefs->standard_keymap = gui->prefs->the_keymap = init_keymap ();
>    displays = g_list_append (displays, gui);
> -  g_print ("No of Displays %d\n", g_list_length (displays));
> +  //g_print ("No of Displays %d\n", g_list_length (displays));
>    if (gui->prefs->autosave)
>      g_timeout_add (gui->prefs->autosave_timeout * 1000 * 60,
>                  (GSourceFunc) auto_save_document_timeout, gui->si);
> +  if (gui->prefs->articulation_palette)
> +    toggle_articulation_palette (NULL, gui);
> +
> +  /* we have to do this properly, because it introduces a keymap */
> +  if (gui->prefs->rhythm_palette) {
> +    GtkWidget *widget = gtk_ui_manager_get_widget (gui->ui_manager, 
> "/RhythmToolBar");
> +    if (GTK_WIDGET_VISIBLE (widget))
> +      g_print("hiding tool bar\n"), gtk_widget_hide(widget);// I do not 
> understand why this is visible - there is no gtk_widget_show(all) in the 
> hierarchy
> +    widget = gtk_ui_manager_get_widget (gui->ui_manager, 
> "/MainMenu/EntryMenu/ToggleRhythmToolbar");
> +    g_signal_emit_by_name(widget, "activate", NULL, gui);
> +    g_print("type is %s\n", g_type_name(G_TYPE_FROM_INSTANCE(widget))); 
> +    }
> +  // A cheap way of doing activating this toolbar, note it is called 
> variously notation toolbar, duration toolbar and EntryToolBar FIXME
> +  if (!gui->prefs->notation_palette)
> +    {
> +      //g_print ("Notation palette %d\n", gui->prefs->notation_palette);
> +      toggle_notation_toolbar (NULL, gui);
> +    }
> +  g_print("Turning on the modes\n");
> +
> + gui->mode = RSM_RHYTHM | INPUTNORMAL;
>  
>  
>   g_free (error);

> _______________________________________________
> Denemo-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/denemo-devel





reply via email to

[Prev in Thread] Current Thread [Next in Thread]