--- gigedit/trunk/src/gigedit/mainwindow.cpp 2011/08/19 10:55:41 2246 +++ gigedit/trunk/src/gigedit/mainwindow.cpp 2013/01/13 09:14:29 2398 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2011 Andreas Persson + * Copyright (C) 2006-2013 Andreas Persson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -20,6 +20,10 @@ #include #include +#include +#include +#include +#include #include #include #include @@ -28,7 +32,9 @@ #include #include #include +#if GTKMM_MAJOR_VERSION < 3 #include "wrapLabel.hh" +#endif #include "global.h" #include "compat.h" @@ -173,6 +179,10 @@ sigc::mem_fun(*this, &MainWindow::on_action_add_instrument) ); actionGroup->add( + Gtk::Action::create("DupInstrument", _("_Duplicate Instrument")), + sigc::mem_fun(*this, &MainWindow::on_action_duplicate_instrument) + ); + actionGroup->add( Gtk::Action::create("RemoveInstrument", Gtk::Stock::REMOVE), sigc::mem_fun(*this, &MainWindow::on_action_remove_instrument) ); @@ -230,6 +240,7 @@ " " " " " " + " " " " " " " " @@ -461,7 +472,7 @@ void Loader::progress_callback(float fraction) { { - Glib::Mutex::Lock lock(progressMutex); + Glib::Threads::Mutex::Lock lock(progressMutex); progress = fraction; } progress_dispatcher(); @@ -469,7 +480,7 @@ void Loader::thread_function() { - printf("thread_function self=%x\n", Glib::Thread::self()); + printf("thread_function self=%x\n", Glib::Threads::Thread::self()); printf("Start %s\n", filename); RIFF::File* riff = new RIFF::File(filename); gig = new gig::File(riff); @@ -489,7 +500,11 @@ void Loader::launch() { +#ifdef OLD_THREADS thread = Glib::Thread::create(sigc::mem_fun(*this, &Loader::thread_function), true); +#else + thread = Glib::Threads::Thread::create(sigc::mem_fun(*this, &Loader::thread_function)); +#endif printf("launch thread=%x\n", thread); } @@ -497,7 +512,7 @@ { float res; { - Glib::Mutex::Lock lock(progressMutex); + Glib::Threads::Mutex::Lock lock(progressMutex); res = progress; } return res; @@ -617,7 +632,7 @@ if (dialog.run() == Gtk::RESPONSE_OK) { std::string filename = dialog.get_filename(); printf("filename=%s\n", filename.c_str()); - printf("on_action_file_open self=%x\n", Glib::Thread::self()); + printf("on_action_file_open self=%x\n", Glib::Threads::Thread::self()); load_file(filename.c_str()); current_gig_dir = Glib::path_get_dirname(filename); } @@ -659,7 +674,7 @@ void MainWindow::on_loader_finished() { printf("Loader finished!\n"); - printf("on_loader_finished self=%x\n", Glib::Thread::self()); + printf("on_loader_finished self=%x\n", Glib::Threads::Thread::self()); load_gig(loader->gig, loader->filename); load_dialog->hide(); } @@ -762,7 +777,12 @@ descriptionArea.set_spacing(15); Gtk::Image warningIcon(Gtk::Stock::DIALOG_WARNING, Gtk::IconSize(Gtk::ICON_SIZE_DIALOG)); descriptionArea.pack_start(warningIcon, Gtk::PACK_SHRINK); +#if GTKMM_MAJOR_VERSION < 3 view::WrapLabel description; +#else + Gtk::Label description; + description.set_line_wrap(); +#endif description.set_markup( _("\nCAUTION: You MUST use the " "\"Save\" dialog instead of " @@ -814,6 +834,7 @@ SF_INFO info; info.format = 0; SNDFILE* hFile = sf_open((*iter).sample_path.c_str(), SFM_READ, &info); + sf_command(hFile, SFC_SET_SCALE_FLOAT_INT_READ, 0, SF_TRUE); try { if (!hFile) throw std::string(_("could not open file")); // determine sample's bit depth @@ -911,7 +932,7 @@ dialog.set_name("Gigedit"); #endif dialog.set_version(VERSION); - dialog.set_copyright("Copyright (C) 2006-2011 Andreas Persson"); + dialog.set_copyright("Copyright (C) 2006-2013 Andreas Persson"); dialog.set_comments(_( "Released under the GNU General Public License.\n" "\n" @@ -1313,6 +1334,31 @@ file_changed(); } +void MainWindow::on_action_duplicate_instrument() { + if (!file) return; + + // retrieve the currently selected instrument + // (being the original instrument to be duplicated) + Glib::RefPtr sel = m_TreeView.get_selection(); + Gtk::TreeModel::iterator itSelection = sel->get_selected(); + if (!itSelection) return; + Gtk::TreeModel::Row row = *itSelection; + gig::Instrument* instrOrig = row[m_Columns.m_col_instr]; + if (!instrOrig) return; + + // duplicate the orginal instrument + gig::Instrument* instrNew = file->AddDuplicateInstrument(instrOrig); + instrNew->pInfo->Name = + instrOrig->pInfo->Name + " (" + _("Copy") + ")"; + + // update instrument tree view + Gtk::TreeModel::iterator iterInstr = m_refTreeModel->append(); + Gtk::TreeModel::Row rowInstr = *iterInstr; + rowInstr[m_Columns.m_col_name] = instrNew->pInfo->Name.c_str(); + rowInstr[m_Columns.m_col_instr] = instrNew; + file_changed(); +} + void MainWindow::on_action_remove_instrument() { if (!file) return; if (file_is_shared) { @@ -1486,7 +1532,6 @@ { sample->MIDIUnityNote = instrument.basenote; -#if HAVE_SF_INSTRUMENT_LOOPS if (instrument.loop_count && instrument.loops[0].mode != SF_LOOP_NONE) { sample->Loops = 1; @@ -1506,7 +1551,6 @@ sample->LoopPlayCount = instrument.loops[0].count; sample->LoopSize = sample->LoopEnd - sample->LoopStart + 1; } -#endif } // schedule resizing the sample (which will be done @@ -1549,7 +1593,7 @@ if (!file) return; Gtk::FileChooserDialog dialog(*this, _("Select Folder"), Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); - view::WrapLabel description( + const char* str = _("This is a very specific function. It tries to replace all samples " "in the current gig file by samples located in the chosen " "directory.\n\n" @@ -1563,8 +1607,13 @@ "the sample in the gig file accordingly. If you don't need an " "extension, blank the field below. Any gig sample where no " "appropriate sample file could be found will be reported and left " - "untouched.\n") - ); + "untouched.\n"); +#if GTKMM_MAJOR_VERSION < 3 + view::WrapLabel description(str); +#else + Gtk::Label description(str); + description.set_line_wrap(); +#endif Gtk::HBox entryArea; Gtk::Label entryLabel( _("Add filename extension: "), Gtk::ALIGN_START); Gtk::Entry postfixEntryBox;