+
+string
+ARDOUR_UI_UTILS::samples_as_time_string (samplecnt_t s, float rate, bool show_samples)
+{
+ char buf[32];
+ if (rate <= 0) {
+ snprintf (buf, sizeof (buf), "--");
+ } else if (s == 0) {
+ snprintf (buf, sizeof (buf), "0");
+ } else if (s < 1000 && show_samples) {
+ /* 0 .. 999 spl */
+ snprintf (buf, sizeof (buf), "%" PRId64" spl", s);
+ } else if (s < (rate / 1000.f)) {
+ /* 0 .. 999 usec */
+ snprintf (buf, sizeof (buf), "%.0f \u00B5s", s * 1e+6f / rate);
+ } else if (s < (rate / 100.f)) {
+ /* 1.000 .. 9.999 ms */
+ snprintf (buf, sizeof (buf), "%.3f ms", s * 1e+3f / rate);
+ } else if (s < (rate / 10.f)) {
+ /* 1.00 .. 99.99 ms */
+ snprintf (buf, sizeof (buf), "%.2f ms", s * 1e+3f / rate);
+ } else if (s < rate) {
+ /* 100.0 .. 999.9 ms */
+ snprintf (buf, sizeof (buf), "%.1f ms", s * 1e+3f / rate);
+ } else if (s < rate * 10.f) {
+ /* 1.000 s .. 9.999 s */
+ snprintf (buf, sizeof (buf), "%.3f s", s / rate);
+ } else if (s < rate * 90.f) {
+ /* 10.00 s .. 89.99 s */
+ snprintf (buf, sizeof (buf), "%.2f s", s / rate);
+ } else {
+ /* 1m30.0 ... */
+ snprintf (buf, sizeof (buf), "'%.0fm%.1f", s / (60.f * rate), fmodf (s / rate, 60));
+ }
+ buf[31] = '\0';
+ return buf;
+}
+
+bool
+ARDOUR_UI_UTILS::windows_overlap (Gtk::Window *a, Gtk::Window *b)
+{
+
+ if (!a || !b) {
+ return false;
+ }
+ if (a->get_screen() == b->get_screen()) {
+ gint ex, ey, ew, eh;
+ gint mx, my, mw, mh;
+
+ a->get_position (ex, ey);
+ a->get_size (ew, eh);
+ b->get_position (mx, my);
+ b->get_size (mw, mh);
+
+ GdkRectangle e;
+ GdkRectangle m;
+ GdkRectangle r;
+
+ e.x = ex;
+ e.y = ey;
+ e.width = ew;
+ e.height = eh;
+
+ m.x = mx;
+ m.y = my;
+ m.width = mw;
+ m.height = mh;
+
+ if (gdk_rectangle_intersect (&e, &m, &r)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool
+ARDOUR_UI_UTILS::overwrite_file_dialog (Gtk::Window& parent, string title, string text)
+{
+ ArdourDialog dialog (parent, title, true);
+ Label label (text);
+
+ dialog.get_vbox()->pack_start (label, true, true);
+ dialog.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+ dialog.add_button (_("Overwrite"), Gtk::RESPONSE_ACCEPT);
+ dialog.show_all ();
+
+ switch (dialog.run()) {
+ case RESPONSE_ACCEPT:
+ return true;
+ case RESPONSE_CANCEL:
+ default:
+ return false;
+ }
+}
+
+bool
+ARDOUR_UI_UTILS::running_from_source_tree ()
+{
+ gchar const *x = g_getenv ("ARDOUR_THEMES_PATH");
+ return x && (string (x).find ("gtk2_ardour") != string::npos);
+}
+
+Gtk::Menu*
+ARDOUR_UI_UTILS::shared_popup_menu ()
+{
+ return ARDOUR_UI::instance()->shared_popup_menu ();
+}