📄 uif_selections.c
字号:
{ 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 + -