File: templatewidget.cpp

package info (click to toggle)
eq10q 1.2-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 592 kB
  • sloc: cpp: 2,105; makefile: 22
file content (276 lines) | stat: -rwxr-xr-x 9,632 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
/***************************************************************************
 *   Copyright (C) 2009 by Pere Ràfols Soler                               *
 *   sapista2@gmail.com                                                    *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include "templatewidget.h"

TemplateWidget::TemplateWidget(main_window *m_ptr, 
                   void (*f_set_ptr) (main_window *myptr, int b_ix, int type, float g, float f, float Q), 
                   void (*f_get_ptr) (main_window *myptr, int band_id, BandParams &m_params))
:b_load("Load Preset"), b_save("Save Preset"), b_remove("Delete Preset"), l_presets("Presets"){
  
  //External functions
  external_get_ptr = f_get_ptr;
  external_set_ptr = f_set_ptr;

  //Inicialment el botto load no fa res
  current_preset=-1;

  //Inicialitza punter a objecte principal
  main_win_ptr = m_ptr;

  //Dibuix de la GUI
  set(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, 0.0, 0.0);
  
  m_box.pack_start(l_presets);
  m_box.pack_start(preset_combo);
  m_box.pack_start(b_load);
  m_box.pack_start(b_save);
  m_box.pack_start(b_remove);
  m_box.set_homogeneous(false);
  m_box.set_size_request(560,-1);
  m_box.set_spacing(2);
  
  add(m_box);
  set_padding(2, 2, 2, 2);
  show_all_children();
  
  //Aseguremnos de k el directori arrel per desar presets exiseix
  redi::ipstream in("echo $HOME");
  std::string cmd;

  in >> strhomedir;
  //std::cout << strhomedir << std::endl;
  in.close();

  cmd = "mkdir " + strhomedir +  "/.RafolsEQ";
  system(cmd.c_str());

  //load_combo_list()  //<--Ho farem en el on_expose de la finestra principal

  //Signals
  b_load.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_load_clicked));
  b_save.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_save_clicked));
  b_remove.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_delete_clicked));
  preset_combo.signal_changed().connect(sigc::mem_fun(*this, &TemplateWidget::on_combo_move));
}

/*Si el load clika, comprobar k no es pq s'esta introduint text i k realment volem
canviar de preset 
en cas afirmatiu carregar el nou preset
*/
void TemplateWidget::on_load_clicked(){
  //std::cout<<"Button load cicked"<<std::endl;
  if(current_preset != -1){ //diferent de -1 implica k no estem introduint text
    std::string cmd = strhomedir + FILE_NAME;
    std::fstream ofs(cmd.c_str(), std::ios::in | std::ios::binary);
    if(!ofs) std::cerr<<"Error: file can't be open";
    else{
       ofs.clear();
       long desp = current_preset*(int)sizeof(f_filter);
       ofs.seekg(desp, std::ios::beg);
       ofs.read(reinterpret_cast<char *>(&f_filter),sizeof(f_filter));
       //cout<<"Row name readed = "<<f_filter.name<<endl;
       
       //Escriure tots els parametres al filtre
        for(int i=0; i<10; i++){ //10 es el nombre de bandes
          external_set_ptr(main_win_ptr, i,
                              f_filter.fparams[i].type,
                              f_filter.fparams[i].gain,
                              f_filter.fparams[i].freq,
                              f_filter.fparams[i].Q
                              );
        }//fi for
        }
        ofs.close();
     }

}

/*Si clickem el button save hem de fer el seguent:
  - Si no s'ha introduit un nom valid (entenent valid com no NUL i no repetit) donar un missatge d'error
  - Si el nom es valid, afegir al combo
  - generar una linea nova en el fitxer de presets
  - Afegir primer el nom del preset introduit en l'entry
  - Afegir despres els parametres del filtre segons: Type, Gain, Freq, Q
  Tancar el fitxer de text eq_presets.prs
*/
void TemplateWidget::on_save_clicked(){
  //std::cout<<"SAVE clicked!"<<std::endl;
  Gtk::Entry* entry = preset_combo.get_entry();


  if(entry){
    //std::string presetname = entry->get_text();
    Glib::ustring presetname = entry->get_text();
    std::string cmd = strhomedir + FILE_NAME;
    if(!presetname.empty()){
      std::fstream ofs(cmd.c_str(), std::ios::out | std::ios::app | std::ios::binary);
      if(!ofs) std::cerr<<"Error: file can't be open";
      else{
        ofs.clear();
        //gestio del nom del preset
        preset_combo.append_text(presetname);
        f_filter.name_length = (NAME_LONG-1 > presetname.length()? presetname.length(): NAME_LONG-1); 
        presetname.copy(f_filter.name,f_filter.name_length,0);
        f_filter.name[f_filter.name_length]='\0'; //ultim caracter
      
        //Escriure tots els parametres del filtre
        for(int i=0; i<10; i++){ //10 es el nombre de bandes
          external_get_ptr(main_win_ptr, i, band_param);

          f_filter.fparams[i].type = band_param.type;
          f_filter.fparams[i].gain = band_param.gain;
          f_filter.fparams[i].freq = band_param.freq;
          f_filter.fparams[i].Q = band_param.Q;
        }
      
        //Ho escribim al fitxer
        ofs.write(reinterpret_cast<char *>(&f_filter),sizeof(f_filter));
       
      }//fi else
      ofs.close();
    }
  }
}

/*Si clickem el butto de delete:
  - mostrem un misatge de text de si estem segurs de voler vorrar el preset
  - Eliminem l'entrada del combo
  - Eliminem la linea del fitxer de text eq_presets.prs
*/
void TemplateWidget::on_delete_clicked(){
  //std::cout<<"DELETE clicked!"<<std::endl;
  int row = preset_combo.get_active_row_number();
  long desp;
  int ix = 0;
  //std::string presetname;
  Glib::ustring presetname;
  std::string cmd;

  //Generem un missatge
  Gtk::MessageDialog dialog((Gtk::Window&)(*this->get_toplevel()),"This will delete the selected preset, are you sure?",
          false /* use_markup */, Gtk::MESSAGE_QUESTION,
          Gtk::BUTTONS_OK_CANCEL);
 
  int result = dialog.run();

 if(row != -1 && result == Gtk::RESPONSE_OK){
    cmd = strhomedir + FILE_NAME_AUX;
    std::fstream ofs(cmd.c_str(), std::ios::out | std::ios::binary);
    cmd = strhomedir + FILE_NAME;
    std::fstream ifs(cmd.c_str(), std::ios::in |  std::ios::binary);
     
    if(!ifs) std::cerr<<"Error: file can't be open";
    else{
      ifs.clear();
      ofs.clear();
      desp = (row)*(int)sizeof(f_filter);
      ifs.seekg(desp, std::ios::beg);
      ifs.read(reinterpret_cast<char *>(&f_filter),sizeof(f_filter));
  
      //pasem-ho a una cadena
      /*for(int i=0; i<f_filter.name_length; i++){
        presetname[i]=f_filter.name[i];
      }*/
      presetname=f_filter.name;
  
      preset_combo.remove_text(presetname);
  
      while(ix != row){
        desp = (ix)*(int)sizeof(f_filter);
        ifs.seekg(desp, std::ios::beg);
      
        ifs.read(reinterpret_cast<char *>(&f_filter),sizeof(f_filter));
        ofs.write(reinterpret_cast<char *>(&f_filter),sizeof(f_filter));
        ix++;
      }
      ix = 0;
      do{
     
        desp = (row+1+ix)*(int)sizeof(f_filter);
        ifs.seekg(desp, std::ios::beg);
        ifs.read(reinterpret_cast<char *>(&f_filter),sizeof(f_filter));
        if(ifs.eof()) break;

        ofs.write(reinterpret_cast<char *>(&f_filter),sizeof(f_filter));
      
        ix++;
      } while(true);
    
     
        std::string cmd = "mv ";
        cmd = cmd + strhomedir + FILE_NAME_AUX + " " +  strhomedir + FILE_NAME;
        system(cmd.c_str());
        
        Gtk::Entry* entry = preset_combo.get_entry();
        entry->set_text("");
        }//else
        ifs.close();
        ofs.close();
      }

}

/*Si el combo es mou, carrega el current_preset la fila k correspon del combo
*/
void TemplateWidget::on_combo_move(){
  current_preset = preset_combo.get_active_row_number();
}


void TemplateWidget::load_combo_list(){
  //std::cout<<"Omplint el combo ..."<<std::endl;
  //primer ho borrem tot
  preset_combo.clear_items();

  //Omplir a partir de fitxer eq_presets.prs
  //std::string presetname;
  Glib::ustring presetname;
  std::string cmd = strhomedir + FILE_NAME;
  std::fstream ofs(cmd.c_str(), std::ios::in | std::ios::binary);

  if(!ofs) std::cerr<<"Error: file can't be open";
  else{
    ofs.clear();
    do{
    ofs.read(reinterpret_cast<char *>(&f_filter),sizeof(f_filter));
    if(ofs.eof()) break;
    
   /* //pasem-ho a una cadena
    for(int i=0; i<f_filter.name_length; i++){
      presetname[i]=f_filter.name[i];
    }
    
    presetname[f_filter.name_length]='\0';
 */
   presetname=f_filter.name;
   preset_combo.append_text(presetname);
    
      }
      while(true);
      
    }
    ofs.close();
}


TemplateWidget::~TemplateWidget(){

}