diff audacious/eq_slider.c @ 0:cb178e5ad177 trunk

[svn] Import audacious source.
author nenolod
date Mon, 24 Oct 2005 03:06:47 -0700
parents
children f12d7e208b43
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/audacious/eq_slider.c	Mon Oct 24 03:06:47 2005 -0700
@@ -0,0 +1,235 @@
+/*  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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 "eq_slider.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+
+#include "equalizer.h"
+#include "mainwin.h"
+#include "skin.h"
+
+void
+eqslider_set_position(EqSlider * es,
+                      gfloat pos)
+{
+    es->es_position = 25 - (gint) ((pos * 25.0) / 20.0);
+
+    if (es->es_position < 0)
+        es->es_position = 0;
+
+    if (es->es_position > 50)
+        es->es_position = 50;
+
+    if (es->es_position >= 24 && es->es_position <= 26)
+        es->es_position = 25;
+
+    widget_draw(WIDGET(es));
+}
+
+gfloat
+eqslider_get_position(EqSlider * es)
+{
+    return 20.0 - (((gfloat) es->es_position * 20.0) / 25.0);
+}
+
+void
+eqslider_draw(Widget * w)
+{
+    EqSlider *es = (EqSlider *) w;
+    GdkPixmap *obj;
+    SkinPixmapId src;
+    gint frame;
+
+    src = SKIN_EQMAIN;
+    obj = es->es_widget.parent;
+
+    frame = 27 - ((es->es_position * 27) / 50);
+    if (frame < 14)
+        skin_draw_pixmap(bmp_active_skin, obj, es->es_widget.gc, src,
+                         (frame * 15) + 13, 164, es->es_widget.x,
+                         es->es_widget.y, es->es_widget.width,
+                         es->es_widget.height);
+    else
+        skin_draw_pixmap(bmp_active_skin, obj, es->es_widget.gc, src,
+                         ((frame - 14) * 15) + 13, 229, es->es_widget.x,
+                         es->es_widget.y, es->es_widget.width,
+                         es->es_widget.height);
+    if (es->es_isdragging)
+        skin_draw_pixmap(bmp_active_skin, obj, es->es_widget.gc, src, 0,
+                         176, es->es_widget.x + 1,
+                         es->es_widget.y + es->es_position, 11, 11);
+    else
+        skin_draw_pixmap(bmp_active_skin, obj, es->es_widget.gc, src, 0,
+                         164, es->es_widget.x + 1,
+                         es->es_widget.y + es->es_position, 11, 11);
+}
+
+void
+eqslider_set_mainwin_text(EqSlider * es)
+{
+    gint band = 0;
+    const gchar *bandname[11] = { N_("PREAMP"), N_("60HZ"), N_("170HZ"),
+        N_("310HZ"), N_("600HZ"), N_("1KHZ"),
+        N_("3KHZ"), N_("6KHZ"), N_("12KHZ"),
+        N_("14KHZ"), N_("16KHZ")
+    };
+    gchar *tmp;
+
+    if (es->es_widget.x > 21)
+        band = ((es->es_widget.x - 78) / 18) + 1;
+
+    tmp =
+        g_strdup_printf("EQ: %s: %+.1f DB", _(bandname[band]),
+                        eqslider_get_position(es));
+    mainwin_lock_info_text(tmp);
+    g_free(tmp);
+}
+
+void
+eqslider_button_press_cb(GtkWidget * w,
+                         GdkEventButton * event,
+                         gpointer data)
+{
+    EqSlider *es = EQ_SLIDER(data);
+    gint y;
+
+    if (widget_contains(&es->es_widget, event->x, event->y)) {
+        if (event->button == 1) {
+            y = event->y - es->es_widget.y;
+            es->es_isdragging = TRUE;
+            if (y >= es->es_position && y < es->es_position + 11)
+                es->es_drag_y = y - es->es_position;
+            else {
+                es->es_position = y - 5;
+                es->es_drag_y = 5;
+                if (es->es_position < 0)
+                    es->es_position = 0;
+                if (es->es_position > 50)
+                    es->es_position = 50;
+                if (es->es_position >= 24 && es->es_position <= 26)
+                    es->es_position = 25;
+                equalizerwin_eq_changed();
+            }
+
+            eqslider_set_mainwin_text(es);
+            widget_draw(WIDGET(es));
+        }
+        if (event->button == 4) {
+            es->es_position -= 2;
+            if (es->es_position < 0)
+                es->es_position = 0;
+            equalizerwin_eq_changed();
+            widget_draw(WIDGET(es));
+        }
+    }
+}
+
+void
+eqslider_mouse_scroll_cb(GtkWidget * w,
+                         GdkEventScroll * event,
+                         gpointer data)
+{
+    EqSlider *es = EQ_SLIDER(data);
+
+    if (!widget_contains(&es->es_widget, event->x, event->y))
+        return;
+
+    if (event->direction == GDK_SCROLL_UP) {
+        es->es_position -= 2;
+
+        if (es->es_position < 0)
+            es->es_position = 0;
+
+        equalizerwin_eq_changed();
+        widget_draw(WIDGET(es));
+    }
+    else {
+        es->es_position += 2;
+
+        if (es->es_position > 50)
+            es->es_position = 50;
+
+        equalizerwin_eq_changed();
+        widget_draw(WIDGET(es));
+    }
+}
+
+void
+eqslider_motion_cb(GtkWidget * w,
+                   GdkEventMotion * event,
+                   gpointer data)
+{
+    EqSlider *es = EQ_SLIDER(data);
+    gint y;
+
+    y = event->y - es->es_widget.y;
+    if (es->es_isdragging) {
+        es->es_position = y - es->es_drag_y;
+        if (es->es_position < 0)
+            es->es_position = 0;
+        if (es->es_position > 50)
+            es->es_position = 50;
+        if (es->es_position >= 24 && es->es_position <= 26)
+            es->es_position = 25;
+        equalizerwin_eq_changed();
+        eqslider_set_mainwin_text(es);
+        widget_draw(WIDGET(es));
+    }
+}
+
+void
+eqslider_button_release_cb(GtkWidget * w,
+                           GdkEventButton * event,
+                           gpointer data)
+{
+    EqSlider *es = EQ_SLIDER(data);
+
+    if (es->es_isdragging) {
+        es->es_isdragging = FALSE;
+        mainwin_release_info_text();
+        widget_draw(WIDGET(es));
+    }
+}
+
+EqSlider *
+create_eqslider(GList ** wlist,
+                GdkPixmap * parent,
+                GdkGC * gc,
+                gint x, gint y)
+{
+    EqSlider *es;
+
+    es = g_new0(EqSlider, 1);
+    widget_init(&es->es_widget, parent, gc, x, y, 14, 63, TRUE);
+    es->es_widget.button_press_cb = eqslider_button_press_cb;
+    es->es_widget.button_release_cb = eqslider_button_release_cb;
+    es->es_widget.motion_cb = eqslider_motion_cb;
+    es->es_widget.draw = eqslider_draw;
+    es->es_widget.mouse_scroll_cb = eqslider_mouse_scroll_cb;
+
+    widget_list_add(wlist, WIDGET(es));
+
+    return es;
+}