/* abGate - LV2 Noise Gate Plugin * * Copyright 2011 Antanas Bružas * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "preset_widget.h" preset_widget::preset_widget(main_window *m_win, void (*set_parameters)(main_window *main_w, float th, float at, float ho, float de, float ra), void (*get_parameters)(main_window *main_w, float &th, float &at, float &ho, float &de, float &ra)) : load_button("Load"), save_button("Save"), delete_button("Delete"), presets_label("Presets:") { // External functions global_get = get_parameters; global_set = set_parameters; main_win = m_win; m_fix.set_size_request(500, 40); /* ========== Colors ========== */ Gdk::Color c_black("#111111"); Gdk::Color c_green("#436d0d"); Gdk::Color c_red("#870b0b"); Gdk::Color c_dred("#4e0707"); Gdk::Color c_dgreen("#273f09"); modify_bg(STATE_NORMAL, c_green); /* ===== Background modifications ===== */ load_button.modify_bg(STATE_NORMAL, c_black); load_button.modify_bg(STATE_ACTIVE, c_dgreen); load_button.modify_bg(STATE_PRELIGHT, c_green); save_button.modify_bg(STATE_NORMAL, c_black); save_button.modify_bg(STATE_ACTIVE, c_dgreen); save_button.modify_bg(STATE_PRELIGHT, c_green); delete_button.modify_bg(STATE_NORMAL, c_black); delete_button.modify_bg(STATE_ACTIVE, c_dred); delete_button.modify_bg(STATE_PRELIGHT, c_red); /* ===== Pango markup for the label ===== */ presets_label.set_use_markup(); m_box.pack_start(presets_label); m_box.pack_start(preset_combo); m_box.pack_start(load_button); m_box.pack_start(save_button); m_box.pack_start(delete_button); m_box.set_homogeneous(false); m_box.set_size_request(424, 28); m_box.set_spacing(2); m_fix.put(m_box, 80, 25); add(m_fix); show_all_children(); /* ===== Moving to directories part ===== */ home_dir = getenv("HOME"); string cmd; dir = home_dir + FILE_NAME; const char *directory = (home_dir + "/.abGate").c_str(); struct stat st; if (stat(directory, &st) != 0) { cmd = "mkdir " + home_dir + "/.abGate && touch " + dir; if (system(cmd.c_str())) { bool ignor = true; } } // Signals load_button.signal_clicked().connect(sigc::mem_fun(*this, &preset_widget::load_clicked)); save_button.signal_clicked().connect(sigc::mem_fun(*this, &preset_widget::save_clicked)); delete_button.signal_clicked().connect(sigc::mem_fun(*this, &preset_widget::delete_clicked)); } void preset_widget::load_clicked() { Entry* entry = preset_combo.get_entry(); if (entry) { ustring presetname = entry->get_text(); if (!presetname.empty()) { presets *p_load = new presets(); // Getting all the names vector names_vector = p_load->get_names_xml(dir); // Checking if we already have this name bool have; for (int i = 0; i < names_vector.size(); i++) { if (presetname == names_vector[i]) { have = true; break; } else { have = false; } } if (have == true) { preset pre_load = p_load->get_one_xml(presetname, dir); global_set(main_win, pre_load.param_value[1], pre_load.param_value[2], pre_load.param_value[3], pre_load.param_value[4], pre_load.param_value[5]); } } } } void preset_widget::save_clicked() { Entry* entry = preset_combo.get_entry(); if (entry) { ustring presetname = entry->get_text(); if (!presetname.empty()) { presets *p_save = new presets(); // Getting all the names vector names_vector = p_save->get_names_xml(dir); // Checking if we already have this name bool have; for (int i = 0; i < names_vector.size(); i++) { if (presetname == names_vector[i]) { have = true; break; } else { have = false; } } if (have == true) { list preset_list = p_save->get_xml(dir); list::iterator it; for (it = preset_list.begin(); it != preset_list.end(); it++) { if (it->name == presetname) { preset_list.erase(it); break; } } // open and after close the file to clear the content of it ofstream presetsfile(dir.c_str()); presetsfile.close(); preset *pre_delete = new preset(); for (it = preset_list.begin(); it != preset_list.end(); it++) { float parameters[6] = { it->param_value[0], it->param_value[1], it->param_value[2], it->param_value[3], it->param_value[4], it->param_value[5] }; pre_delete->construct(it->name, parameters); p_save->set_xml(*pre_delete, false, dir); } // Adding new preset preset *pre_save = new preset(); global_get(main_win, th, at, ho, de, ra); float parameters[6] = { 1, th, at, ho, de, ra }; pre_save->construct(presetname, parameters); p_save->set_xml(*pre_save, false, dir); } else { // Adding new preset preset *pre_save = new preset(); global_get(main_win, th, at, ho, de, ra); float parameters[6] = { 1, th, at, ho, de, ra }; pre_save->construct(presetname, parameters); p_save->set_xml(*pre_save, false, dir); preset_combo.append_text(presetname); } } } } void preset_widget::delete_clicked() { Entry* entry = preset_combo.get_entry(); if (entry) { ustring presetname = entry->get_text(); if (!presetname.empty()) { presets *p_delete = new presets(); // Getting all the names vector names_vector = p_delete->get_names_xml(dir); // Checking if we already have this name bool have; for (int i = 0; i < names_vector.size(); i++) { if (presetname == names_vector[i]) { have = true; break; } else { have = false; } } if (have == true) { MessageDialog dialog((Window&) (*this->get_toplevel()), "Do you really want to delete preset " + presetname + "?", true, MESSAGE_QUESTION, BUTTONS_OK_CANCEL); int result = dialog.run(); if (result == RESPONSE_OK) { list preset_list = p_delete->get_xml(dir); list::iterator it; for (it = preset_list.begin(); it != preset_list.end(); it++) { if (it->name == presetname) { preset_list.erase(it); break; } } // open and after close the file to clear the content of it ofstream presetsfile(dir.c_str()); presetsfile.close(); preset *pre_delete = new preset(); for (it = preset_list.begin(); it != preset_list.end(); it++) { float parameters[6] = { it->param_value[0], it->param_value[1], it->param_value[2], it->param_value[3], it->param_value[4], it->param_value[5] }; pre_delete->construct(it->name, parameters); p_delete->set_xml(*pre_delete, false, dir); } preset_combo.remove_text(presetname); entry->set_text(""); } } } } } void preset_widget::load_combo_list() { preset_combo.clear_items(); ustring presetname; presets *p_names = new presets(); vector names_vector = p_names->get_names_xml(dir); for (int i = 0; i < names_vector.size(); i++) { presetname = names_vector[i]; preset_combo.append_text(presetname); } } preset_widget::~preset_widget() { }