*/
#include <string>
+#include <sstream>
#include <climits>
#include <cstdio>
#include <cmath>
#include <pbd/controllable.h>
-#include <gtkmm2ext/gtk_ui.h>
-#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/barcontroller.h>
+#include "gtkmm2ext/gtk_ui.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/keyboard.h"
+#include "gtkmm2ext/barcontroller.h"
#include "i18n.h"
switching = false;
switch_on_release = false;
use_parent = false;
+ logarithmic = false;
layout = darea.create_pango_layout("");
spinner.signal_input().connect (mem_fun (*this, &BarController::entry_input));
spinner.signal_output().connect (mem_fun (*this, &BarController::entry_output));
spinner.set_digits (3);
+ spinner.set_numeric (true);
add (darea);
show_all ();
return true;
}
- if ((ev->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK)) == GDK_SHIFT_MASK) {
+ if ((ev->state & (Keyboard::TertiaryModifier|Keyboard::PrimaryModifier)) == Keyboard::TertiaryModifier) {
adjustment.set_value (initial_value);
} else {
double scale;
- if ((ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
+ if ((ev->state & (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) == (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) {
scale = 0.01;
- } else if (ev->state & GDK_CONTROL_MASK) {
+ } else if (ev->state & Keyboard::PrimaryModifier) {
scale = 0.1;
} else {
scale = 1.0;
{
double scale;
- if ((ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
+ if ((ev->state & (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) == (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) {
scale = 0.01;
- } else if (ev->state & GDK_CONTROL_MASK) {
+ } else if (ev->state & Keyboard::PrimaryModifier) {
scale = 0.1;
} else {
scale = 1.0;
return true;
}
- if ((ev->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK)) == GDK_SHIFT_MASK) {
+ if ((ev->state & (Keyboard::TertiaryModifier|Keyboard::PrimaryModifier)) == Keyboard::TertiaryModifier) {
return TRUE;
}
- if ((ev->state & (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) == (GDK_CONTROL_MASK|GDK_SHIFT_MASK)) {
+ if ((ev->state & (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) == (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier)) {
scale = 0.01;
- } else if (ev->state & GDK_CONTROL_MASK) {
+ } else if (ev->state & Keyboard::PrimaryModifier) {
scale = 0.1;
} else {
scale = 1.0;
}
bool
-BarController::expose (GdkEventExpose* event)
+BarController::expose (GdkEventExpose* /*event*/)
{
Glib::RefPtr<Gdk::Window> win (darea.get_window());
Widget* parent;
}
void
-BarController::set_style (Style s)
+BarController::set_style (barStyle s)
{
_style = s;
darea.queue_draw ();
void
BarController::entry_activated ()
{
- string text = spinner.get_text ();
- float val;
-
- if (sscanf (text.c_str(), "%f", &val) == 1) {
- adjustment.set_value (val);
- }
-
switch_to_bar ();
}
bool
-BarController::entry_focus_out (GdkEventFocus* ev)
+BarController::entry_focus_out (GdkEventFocus* /*ev*/)
{
entry_activated ();
return true;
darea.set_sensitive (yn);
}
-bool
-BarController::entry_input (double* v)
+/*
+ This is called when we need to update the adjustment with the value
+ from the spinner's text entry.
+
+ We need to use Gtk::Entry::get_text to avoid recursive nastiness :)
+
+ If we're not in logarithmic mode we can return false to use the
+ default conversion.
+
+ In theory we should check for conversion errors but set numeric
+ mode to true on the spinner prevents invalid input.
+*/
+int
+BarController::entry_input (double* new_value)
{
- return false;
+ if (!logarithmic) {
+ return false;
+ }
+
+ // extract a double from the string and take its log
+ Entry *entry = dynamic_cast<Entry *>(&spinner);
+ stringstream stream(entry->get_text());
+ stream.imbue(std::locale(""));
+
+ double value;
+ stream >> value;
+
+ *new_value = log(value);
+ return true;
}
+/*
+ This is called when we need to update the spinner's text entry
+ with the value of the adjustment.
+
+ We need to use Gtk::Entry::set_text to avoid recursive nastiness :)
+
+ If we're not in logarithmic mode we can return false to use the
+ default conversion.
+*/
bool
BarController::entry_output ()
{
- return false;
+ if (!logarithmic) {
+ return false;
+ }
+
+ // generate the exponential and turn it into a string
+ // convert to correct locale.
+
+ stringstream stream;
+ string str;
+ size_t found;
+
+ // Gtk.Entry does not like the thousands separator, so we have to
+ // remove it after conversion from float to string.
+
+ stream.imbue(std::locale(""));
+ stream.precision(spinner.get_digits());
+
+ stream << fixed << exp(spinner.get_adjustment()->get_value());
+
+ str=stream.str();
+
+ // find thousands separators, remove them
+ found = str.find(use_facet<numpunct<char> >(std::locale("")).thousands_sep());
+ while(found != str.npos) {
+ str.erase(found,1);
+
+ //find next
+ found = str.find(use_facet<numpunct<char> >(std::locale("")).thousands_sep());
+ }
+
+ Entry *entry = dynamic_cast<Entry *>(&spinner);
+ entry->set_text(str);
+
+ return true;
}
+