⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uif_selections.c

📁 A GTK sound font editor. Sound font files are used to synthesize instruments from audio samples for
💻 C
📖 第 1 页 / 共 3 页
字号:
    {      if (dstuisf != srcuisf)	/* different sound font? */	{			/* duplicate the sample */	  p = uisel_clone_sample (p, dstuisf, srcuisf, mode);	  if (!p) return (NULL); /* waiting for user input or cancel? */	}      if (mode == UISEL_CANCEL) return (NULL); /* catch cancel request */      z = sfont_new_inst_zone (dstuisf->sf, inst, p);    }  else if (srcref->type == NODE_IZONE) /* item is instrument zone? */    {      z = (SFZone *) (p->data);	/* get instrument zone */      p2 = NULL;      /* Global Zone? */      if (z->instsamp)	{	  if (dstuisf != srcuisf) /* not a global zone, same sound font? */	    {			/* duplicate the sample */	      p2 = uisel_clone_sample (z->instsamp, dstuisf, srcuisf, mode);	      if (!p2) return (NULL); /* waiting for user input or cancel? */	    }	}      else			/* its a global zone */	{	  switch (mode)	    {	    case UISEL_START:	      /* instrument already has Global Zone? */	      if (inst->zone && !((SFZone *)(inst->zone->data))->instsamp)		{		  /* Duplicate global zone dialog: Replace, Keep, Cancel */		  popdog =		    util_quick_popup (_("Duplicate global instrument zone"),				      _("Keep"), uisel_cb_dup_zone,				      GINT_TO_POINTER (UISEL_KEEP),				      _("Cancel"), uisel_cb_dup_zone,				      GINT_TO_POINTER (UISEL_CANCEL),				      NULL);		  gtk_signal_connect (GTK_OBJECT (popdog), "destroy",				      (GtkSignalFunc)uisel_cb_dup_zone_destroy,				      NULL);		  return (NULL); /* return to wait for user input */		}	      break;	    case UISEL_REPLACE:	/* not done yet (fall through) */	    case UISEL_KEEP:	      return (p);	    default:	      break;	    }	}      if (mode == UISEL_CANCEL) return (NULL); /* catch cancel request */      z = sfont_zone_dup (z, SFDUP_NORMAL); /* duplicate the izone */      /* if dstuisf != srcuisf, point to the new sample */      if (p2) z->instsamp = p2;      sfont_add_inst_zone (dstuisf->sf, inst, z);    }  /* add zone to sftree */  duplzone = g_slist_find (inst->zone, z);  node = sftree_add_izone (duplzone, pnode, SFTREE_NODE_APPEND);  /* tell sfundo about our new zone */  dofunc_noitem_save (SFTREE_NODE_REF (node)->itemid);  if (inst == uisf_selected_elem)    pianospan_update ();	/* update key spans */  wtbl_sfitem_changed (inst->itemid, WTBL_ITEM_CHANGE);  return (duplzone);}static gpointeruisel_vbank_paste (GtkCTreeNode *dstnode, SFPreset *pset, SFData *srcsf){  UIVBank *uivb;  VBnkItem *item;  SFTreeRef *ref;  GSList *lmap;  gint bank = 0, preset = 0;  ref = SFTREE_NODE_REF (dstnode);  uivb = SFTREE_UPFIND_UIVB (dstnode);  /* if preset was pasted to another map, find the next highest free     map bank:preset */  if (ref->type == NODE_VBNK_MAP)    {      VBnkItem *item = (VBnkItem *)(((GSList *)(ref->dptr))->data);      bank = item->map.bank;      preset = item->map.psetnum;      if (++preset > 127)	{	  preset = 0;	  bank++;	}    }  vbank_find_free_map (&bank, &preset, uivb->vbnk);  item = vbank_add_map (bank, preset, -1, pset->bank, pset->prenum, -1,			vbank_base_fname (srcsf->fname), uivb->vbnk);  lmap = g_slist_find (uivb->vbnk->items, item);  sftree_add_vbank_map_sorted (lmap, uivb->nodes);  return (GINT_TO_POINTER (1));}/* creates duplicate item dialog and inserts label, src value and dest   value triplet parameters.   (gchar *lbl1, gchar *srcval1, gchar *dstval1, gchar *lbl2, ...) */static voiduisel_dup_item_dialog (gchar *lbl1, ...){  va_list ap;  GtkText *src, *dst;  gchar *s, *s2;  dup_item_dialog = create_uisel_dup_dialog ();  src = gtk_object_get_data (GTK_OBJECT (dup_item_dialog), "TXTsrc");  dst = gtk_object_get_data (GTK_OBJECT (dup_item_dialog), "TXTdst");  s = lbl1;  va_start (ap, lbl1);  while (s)    {      s = g_strconcat (s, ": ", NULL);      gtk_text_insert (src, NULL, NULL, NULL, s, -1);      gtk_text_insert (dst, NULL, NULL, NULL, s, -1);      g_free (s);      s = va_arg (ap, gchar *);      s = g_strconcat (s, "\n", NULL);      gtk_text_insert (src, NULL, NULL, NULL, s, -1);      s2 = va_arg (ap, gchar *);      if (!s2) s2 = s;      else s2 = g_strconcat (s2, "\n", NULL);      gtk_text_insert (dst, NULL, NULL, NULL, s2, -1);      if (s != s2) g_free(s2);      g_free (s);      s = va_arg (ap, gchar *);    }  /* if dup window gets destroyed, cancel paste operation */  gtk_signal_connect (GTK_OBJECT (dup_item_dialog), "destroy",		      (GtkSignalFunc)uisel_cb_dup_item_destroy, NULL);  gtk_widget_show (dup_item_dialog);}static gbooleanuisel_cb_dup_item_destroy (GtkWidget *dialog){  uisel_paste_items (SFITEMID_NONE, UISEL_CANCEL);  return (FALSE);}/* gets user choice from duplicate item dialog and restarts paste routine */voiduisel_cb_dup_item (GtkWidget *btn, gint num){  gint mode;  gboolean all = FALSE;  SFPreset *pset;  SFInst *inst;  SFSample *sam;  GtkWidget *w;  switch (num)    {    case 0:			/* Change item */      /* pop dialog to change item information */      switch (paste_item_type)	{	case NODE_PRESET:	  pset = paste_item_data;	  w = uisf_create_preset_config_dialog (_("Modify Preset"), pset->name,				pset->bank, pset->prenum,				(GtkSignalFunc)uisel_cb_preset_change_okay);	  gtk_window_set_modal (GTK_WINDOW (w), TRUE);	  gtk_widget_show (w);	  break;	case NODE_INST:	  inst = paste_item_data;	  w = uisf_create_inst_config_dialog (_("Rename Instrument"),				inst->name,				(GtkSignalFunc)uisel_cb_inst_change_okay);	  gtk_window_set_modal (GTK_WINDOW (w), TRUE);	  gtk_widget_show (w);	  break;	case NODE_SAMPLE:	  sam = paste_item_data;	  /* rate = 0 in call, so rate/fine tune settings will not be shown */	  w = uisf_create_sample_config_dialog (_("Rename Sample"), sam->name,			  0, 0, (GtkSignalFunc)uisel_cb_sample_change_okay);	  gtk_window_set_modal (GTK_WINDOW (w), TRUE);	  gtk_widget_show (w);	  break;	default:	  return;	}      return;			/* return,uisel_cb_*_change_okay will notify */    case 2:			/* Replace All */      all = TRUE;  /* fall through case */    case 1:			/* Replace */      mode = UISEL_REPLACE;      break;    case 4:			/* Keep All */      all = TRUE;  /* fall through case */    case 3:			/* Keep */      mode = UISEL_KEEP;      break;    case 5:			/* Cancel */      mode = UISEL_CANCEL;      break;    }  if (all)			/* User requested Keep All/Replace All */    {      switch (paste_item_type)	{	case NODE_PRESET:	  preset_all_mode = mode;	  break;	case NODE_INST:	  inst_all_mode = mode;	  break;	case NODE_SAMPLE:	  sample_all_mode = mode;	  break;	default:	  return;	}    }  gtk_signal_disconnect_by_func (GTK_OBJECT (dup_item_dialog),				 (GtkSignalFunc)uisel_cb_dup_item_destroy,				 NULL);  gtk_widget_destroy (dup_item_dialog);  uisel_paste_items (SFITEMID_NONE, mode);}/* callback for preset change */static voiduisel_cb_preset_change_okay (GtkWidget *cfgdialog){  SFPreset *pset;  GtkWidget *widg;  /* change data for duplicated preset in the works */  pset = paste_item_data;  widg = gtk_object_get_data (GTK_OBJECT (cfgdialog), "ENname");  sfont_set_namestr_nosf (pset->name, gtk_entry_get_text (GTK_ENTRY (widg)));  widg = gtk_object_get_data (GTK_OBJECT (cfgdialog), "SPBbank");  pset->bank = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widg));  widg = gtk_object_get_data (GTK_OBJECT (cfgdialog), "SPBprenum");  pset->prenum = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widg));  gtk_widget_destroy (cfgdialog);  gtk_signal_disconnect_by_func (GTK_OBJECT (dup_item_dialog),				 (GtkSignalFunc)uisel_cb_dup_item_destroy,				 NULL);  gtk_widget_destroy (dup_item_dialog);  /* restart paste function */  uisel_paste_items (SFITEMID_NONE, UISEL_CHANGE);}/* callback for instrument change */static voiduisel_cb_inst_change_okay (GtkWidget *cfgdialog){  SFInst *inst;  GtkWidget *widg;  /* change data for duplicated instrument in the works */  inst = paste_item_data;  widg = gtk_object_get_data (GTK_OBJECT (cfgdialog), "ENname");  sfont_set_namestr_nosf (inst->name, gtk_entry_get_text (GTK_ENTRY (widg)));  gtk_widget_destroy (cfgdialog);  gtk_signal_disconnect_by_func (GTK_OBJECT (dup_item_dialog),				 (GtkSignalFunc)uisel_cb_dup_item_destroy,				 NULL);  gtk_widget_destroy (dup_item_dialog);  /* restart paste function */  uisel_paste_items (SFITEMID_NONE, UISEL_CHANGE);}/* callback for sample change */static voiduisel_cb_sample_change_okay (GtkWidget *cfgdialog){  SFSample *sam;  GtkWidget *widg;  /* change data for duplicated sample in the works */  sam = paste_item_data;  widg = gtk_object_get_data (GTK_OBJECT (cfgdialog), "ENname");  sfont_set_namestr_nosf (sam->name, gtk_entry_get_text (GTK_ENTRY (widg)));  gtk_widget_destroy (cfgdialog);  gtk_signal_disconnect_by_func (GTK_OBJECT (dup_item_dialog),				 (GtkSignalFunc)uisel_cb_dup_item_destroy,				 NULL);  gtk_widget_destroy (dup_item_dialog);  /* restart paste function */  uisel_paste_items (SFITEMID_NONE, UISEL_CHANGE);}static voiduisel_cb_dup_zone (gpointer data, GtkWidget *popdog){  gint mode;  mode = GPOINTER_TO_INT (data);  gtk_signal_disconnect_by_func (GTK_OBJECT (popdog),				 (GtkSignalFunc)uisel_cb_dup_zone_destroy,				 NULL);  gtk_widget_destroy (popdog);  uisel_paste_items (SFITEMID_NONE, mode);}static gbooleanuisel_cb_dup_zone_destroy (GtkWidget *popdog){  uisel_paste_items (SFITEMID_NONE, UISEL_CANCEL);  return (FALSE);}voiduisel_dialog_selection_delete (void){  GList *sel;  GtkWidget *popdog;  if (!(sel = sftree_get_selection_multi ())) return;  /* if just one item, call single item delete routine */  if (!sel->next)    {      uisf_dialog_sfitem_delete ();      return;    }  popdog =    util_quick_popup (_("Confirm delete of selected items"),		      _("OK"), uisel_cb_dialog_selection_delete_okay, NULL,		      _("Cancel"), NULL, NULL,		      NULL);  /* free selection list when popdog is destroyed */  gtk_object_set_data_full (GTK_OBJECT (popdog), "sel", sel,			    (GtkDestroyNotify) g_list_free);}/* delete selected sound font items and orphaned instruments/samples if   specified */static voiduisel_cb_dialog_selection_delete_okay (gpointer data, GtkWidget *popdog){  SFItemID itemid;  GList *p;  p = gtk_object_get_data (GTK_OBJECT (popdog), "sel");  sfdo_group (_("Delete sound font items"));  SFTREE_FREEZE ();  while (p)    {				/* loop over selection */      itemid = GPOINTER_TO_INT(p->data);      /* remove node if it hasn't already been removed */      if (itemid && SFTREE_LOOKUP_ITEMID (itemid))	  uisf_sfitem_delete (itemid); /* delete it */      p = g_list_next (p);    }  SFTREE_THAW ();  sfdo_done ();  gtk_widget_destroy (popdog);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -