4 * Copyright (C) 2018 GG
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include "pluginlv2client.h"
30 #include "pluginlv2config.h"
31 #include "pluginlv2gui.h"
32 #include "pluginserver.h"
33 #include "preferences.h"
40 PluginLV2ClientUI::PluginLV2ClientUI(PluginLV2ClientWindow *gui, int x, int y)
41 : BC_GenericButton(x, y, _("UI"))
46 PluginLV2ClientUI::~PluginLV2ClientUI()
50 int PluginLV2ClientUI::handle_event()
52 PluginLV2ParentUI *ui = gui->get_ui();
58 PluginLV2ClientReset::
59 PluginLV2ClientReset(PluginLV2ClientWindow *gui, int x, int y)
60 : BC_GenericButton(x, y, _("Reset"))
65 PluginLV2ClientReset::
66 ~PluginLV2ClientReset()
70 int PluginLV2ClientReset::handle_event()
72 PluginLV2Client *client = gui->client;
73 client->config.init_lv2(client->lilv, client);
74 client->config.update();
77 client->send_configure_change();
81 PluginLV2ClientText::PluginLV2ClientText(PluginLV2ClientWindow *gui, int x, int y, int w)
82 : BC_TextBox(x, y, w, 1, (char *)"")
87 PluginLV2ClientText::~PluginLV2ClientText()
91 int PluginLV2ClientText::handle_event()
97 PluginLV2ClientApply::PluginLV2ClientApply(PluginLV2ClientWindow *gui, int x, int y)
98 : BC_GenericButton(x, y, _("Apply"))
103 PluginLV2ClientApply::~PluginLV2ClientApply()
107 int PluginLV2ClientApply::handle_event()
109 const char *text = gui->text->get_text();
110 if( text && gui->selected ) {
111 gui->selected->update(atof(text));
112 gui->update_selected();
113 gui->client->send_configure_change();
119 PluginLV2Client_OptPanel::PluginLV2Client_OptPanel(PluginLV2ClientWindow *gui,
120 int x, int y, int w, int h)
121 : BC_ListBox(x, y, w, h, LISTBOX_TEXT), opts(items[0]), vals(items[1])
124 update(); // init col/wid/columns
127 PluginLV2Client_OptPanel::~PluginLV2Client_OptPanel()
131 int PluginLV2Client_OptPanel::selection_changed()
133 PluginLV2Client_Opt *opt = 0;
134 BC_ListBoxItem *item = get_selection(0, 0);
136 PluginLV2Client_OptName *opt_name = (PluginLV2Client_OptName *)item;
143 void PluginLV2Client_OptPanel::update()
147 PluginLV2ClientConfig &conf = gui->client->config;
148 for( int i=0; i<conf.size(); ++i ) {
149 PluginLV2Client_Opt *opt = conf[i];
150 opts.append(opt->item_name);
151 vals.append(opt->item_value);
153 const char *cols[] = { "option", "value", };
154 const int col1_w = 150;
155 int wids[] = { col1_w, get_w()-col1_w };
156 BC_ListBox::update(&items[0], &cols[0], &wids[0], sizeof(items)/sizeof(items[0]));
159 PluginLV2ClientPot::PluginLV2ClientPot(PluginLV2ClientWindow *gui, int x, int y)
160 : BC_FPot(x, y, 0.f, 0.f, 0.f)
165 int PluginLV2ClientPot::handle_event()
167 if( gui->selected ) {
168 gui->selected->update(get_value());
169 gui->update_selected();
170 gui->client->send_configure_change();
175 PluginLV2ClientSlider::PluginLV2ClientSlider(PluginLV2ClientWindow *gui, int x, int y)
176 : BC_FSlider(x, y, 0, gui->get_w()-x-20, gui->get_w()-x-20, 0.f, 0.f, 0.f)
181 int PluginLV2ClientSlider::handle_event()
183 if( gui->selected ) {
184 gui->selected->update(get_value());
185 gui->update_selected();
186 gui->client->send_configure_change();
191 PluginLV2ClientWindow::PluginLV2ClientWindow(PluginLV2Client *client)
192 : PluginClientWindow(client, 500, 300, 500, 300, 1)
194 this->client = client;
198 void PluginLV2ClientWindow::done_event(int result)
200 PluginLV2ParentUI *ui = PluginLV2ParentUI::plugin_lv2.del_ui(this);
204 PluginLV2ClientWindow::~PluginLV2ClientWindow()
210 void PluginLV2ClientWindow::create_objects()
213 int x = 10, y = 10, x1;
214 add_subwindow(title = new BC_Title(x, y, client->title));
215 x1 = get_w() - BC_GenericButton::calculate_w(this, _("UI")) - 8;
216 add_subwindow(ui = new PluginLV2ClientUI(this, x1, y));
218 y += title->get_h() + 10;
219 add_subwindow(varbl = new BC_Title(x, y, ""));
220 add_subwindow(range = new BC_Title(x+160, y, ""));
221 x1 = get_w() - BC_GenericButton::calculate_w(this, _("Reset")) - 8;
222 add_subwindow(reset = new PluginLV2ClientReset(this, x1, y));
223 y += title->get_h() + 10;
224 x1 = get_w() - BC_GenericButton::calculate_w(this, _("Apply")) - 8;
225 add_subwindow(apply = new PluginLV2ClientApply(this, x1, y));
226 add_subwindow(text = new PluginLV2ClientText(this, x, y, x1-x - 8));
227 y += title->get_h() + 10;
228 add_subwindow(pot = new PluginLV2ClientPot(this, x, y));
229 x1 = x + pot->get_w() + 10;
230 add_subwindow(slider = new PluginLV2ClientSlider(this, x1, y+10));
231 y += pot->get_h() + 10;
233 client->load_configuration();
234 client->config.update();
236 int panel_x = x, panel_y = y;
237 int panel_w = get_w()-10 - panel_x;
238 int panel_h = get_h()-10 - panel_y;
239 panel = new PluginLV2Client_OptPanel(this, panel_x, panel_y, panel_w, panel_h);
240 add_subwindow(panel);
244 if( client->server->mwindow->preferences->autostart_lv2ui ) {
245 PluginLV2ParentUI *ui = get_ui();
250 int PluginLV2ClientWindow::resize_event(int w, int h)
253 x1 = w - ui->get_w() - 8;
254 ui->reposition_window(x1, ui->get_y());
255 x1 = w - reset->get_w() - 8;
256 reset->reposition_window(x1, reset->get_y());
257 x1 = w - apply->get_w() - 8;
258 apply->reposition_window(x1, apply->get_y());
259 text->reposition_window(text->get_x(), text->get_y(), x1-text->get_x() - 8);
260 x1 = pot->get_x() + pot->get_w() + 10;
261 int w1 = w - slider->get_x() - 20;
262 slider->set_pointer_motion_range(w1);
263 slider->reposition_window(x1, slider->get_y(), w1, slider->get_h());
264 int panel_x = panel->get_x(), panel_y = panel->get_y();
265 panel->reposition_window(panel_x, panel_y, w-10-panel_x, h-10-panel_y);
269 void PluginLV2ClientWindow::update_selected()
272 if( !selected ) return;
273 PluginLV2ParentUI *ui = find_ui();
275 PluginLV2ClientConfig &conf = client->config;
276 ui->send_child(LV2_UPDATE, conf.ctls, sizeof(float)*conf.nb_ports);
279 int PluginLV2ClientWindow::scalar(float f, char *rp)
282 if( f == FLT_MAX ) cp = "FLT_MAX";
283 else if( f == FLT_MIN ) cp = "FLT_MIN";
284 else if( f == -FLT_MAX ) cp = "-FLT_MAX";
285 else if( f == -FLT_MIN ) cp = "-FLT_MIN";
286 else if( f == 0 ) cp = signbit(f) ? "-0" : "0";
287 else if( isnan(f) ) cp = signbit(f) ? "-NAN" : "NAN";
288 else if( isinf(f) ) cp = signbit(f) ? "-INF" : "INF";
289 else return sprintf(rp, "%g", f);
290 return sprintf(rp, "%s", cp);
293 void PluginLV2ClientWindow::update(PluginLV2Client_Opt *opt)
295 if( selected != opt ) {
296 if( selected ) selected->item_name->set_selected(0);
298 if( selected ) selected->item_name->set_selected(1);
300 char var[BCSTRLEN]; var[0] = 0;
301 char val[BCSTRLEN]; val[0] = 0;
302 char rng[BCTEXTLEN]; rng[0] = 0;
304 sprintf(var,"%s:", opt->conf->names[opt->idx]);
306 cp += sprintf(cp,"( ");
307 float min = opt->conf->mins[opt->idx];
308 cp += scalar(min, cp);
309 cp += sprintf(cp, " .. ");
310 float max = opt->conf->maxs[opt->idx];
311 cp += scalar(max, cp);
312 cp += sprintf(cp, " )");
313 float v = opt->get_value();
314 sprintf(val, "%f", v);
315 float p = (max-min) / slider->get_w();
316 slider->set_precision(p);
317 slider->update(slider->get_w(), v, min, max);
318 pot->set_precision(p);
319 pot->update(v, min, max);
322 slider->update(slider->get_w(), 0.f, 0.f, 0.f);
323 pot->update(0.f, 0.f, 0.f);
331 void PluginLV2ClientWindow::lv2_update()
333 lock_window("PluginLV2ClientWindow::lv2_update");
334 PluginLV2ClientConfig &conf = client->config;
335 int ret = conf.update();
336 if( ret > 0 ) update(0);
339 client->send_configure_change();
342 void PluginLV2ClientWindow::lv2_update(float *vals)
344 PluginLV2ClientConfig &conf = client->config;
345 int nb_ports = conf.nb_ports;
346 float *ctls = conf.ctls;
347 for( int i=0; i<nb_ports; ++i ) *ctls++ = *vals++;
351 void PluginLV2ClientWindow::lv2_set(int idx, float val)
353 PluginLV2ClientConfig &conf = client->config;
354 conf[idx]->set_value(val);
358 void PluginLV2ClientWindow::lv2_ui_enable()
360 lock_window("PluginLV2ClientWindow::lv2_update");