r175 - trunk/src/target/OM-2007/applications/openmoko-chordmaster

mickey at gta01.hmw-consulting.de mickey at gta01.hmw-consulting.de
Thu Nov 2 14:17:41 CET 2006


Author: mickey
Date: 2006-11-02 13:17:39 +0000 (Thu, 02 Nov 2006)
New Revision: 175

Added:
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/ball.png
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.c
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.h
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/wood.png
Modified:
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/callbacks.c
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/callbacks.h
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/main.c
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/main.h
   trunk/src/target/OM-2007/applications/openmoko-chordmaster/openmoko-chordmaster.pro
Log:
chordmaster: show chords on fretboard


Added: trunk/src/target/OM-2007/applications/openmoko-chordmaster/ball.png
===================================================================
(Binary files differ)


Property changes on: trunk/src/target/OM-2007/applications/openmoko-chordmaster/ball.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Modified: trunk/src/target/OM-2007/applications/openmoko-chordmaster/callbacks.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-chordmaster/callbacks.c	2006-11-01 22:36:36 UTC (rev 174)
+++ trunk/src/target/OM-2007/applications/openmoko-chordmaster/callbacks.c	2006-11-02 13:17:39 UTC (rev 175)
@@ -1,7 +1,10 @@
 #include "callbacks.h"
+#include "fretboard-widget.h"
 
 #include <gtk/gtkwidget.h>
 #include <gtk/gtkbutton.h>
+#include <gtk/gtktreeview.h>
+#include <gtk/gtktreemodel.h>
 
 gboolean cb_filter_changed(GtkWidget* widget, gchar* text, gpointer user_data)
 {
@@ -28,3 +31,19 @@
 {
     g_debug( "openmoko-chordmaster: button4 clicked" );
 }
+
+void cb_cursor_changed(GtkTreeSelection* selection, ChordMasterData* d)
+{
+    g_debug( "openmoko-chordmaster: selection changed" );
+    GtkTreeView* view = gtk_tree_selection_get_tree_view( selection );
+    GtkTreeModel* model;
+    GtkTreeIter iter;
+    gtk_tree_selection_get_selected( selection, &model, &iter );
+
+    gchar* frets;
+    gtk_tree_model_get( model, &iter, COLUMN_FRETS, &frets, -1 );
+
+    fretboard_widget_set_frets( d->fretboard, frets );
+    gtk_widget_queue_draw( GTK_WIDGET(d->fretboard) );
+}
+

Modified: trunk/src/target/OM-2007/applications/openmoko-chordmaster/callbacks.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-chordmaster/callbacks.h	2006-11-01 22:36:36 UTC (rev 174)
+++ trunk/src/target/OM-2007/applications/openmoko-chordmaster/callbacks.h	2006-11-02 13:17:39 UTC (rev 175)
@@ -1,8 +1,11 @@
 #ifndef _CALLBACKS_H_
 #define _CALLBACKS_H_
 
+#include "main.h"
+
 #include <gtk/gtkbutton.h>
 #include <gtk/gtkwidget.h>
+#include <gtk/gtktreeview.h>
 
 #include <glib.h>
 
@@ -11,5 +14,6 @@
 void cb_button2_clicked(GtkButton *button, gpointer user_data);
 void cb_button3_clicked(GtkButton *button, gpointer user_data);
 void cb_button4_clicked(GtkButton *button, gpointer user_data);
+void cb_cursor_changed(GtkTreeSelection* selection, ChordMasterData* d);
 
 #endif

Added: trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.c	2006-11-01 22:36:36 UTC (rev 174)
+++ trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.c	2006-11-02 13:17:39 UTC (rev 175)
@@ -0,0 +1,196 @@
+/*  fretboard-widget.c
+ *
+ *  Authored By Michael 'Mickey' Lauer <mlauer at vanille-media.de>
+ *
+ *  Copyright (C) 2006 Vanille-Media
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: mickey $]
+ */
+
+#include "fretboard-widget.h"
+
+#include <pango/pango.h>
+
+G_DEFINE_TYPE (FretboardWidget, fretboard_widget, GTK_TYPE_DRAWING_AREA);
+
+#define FRETBOARD_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), CHORD_TYPE_FRETBOARD, FretboardWidgetPrivate))
+
+typedef struct _FretboardWidgetPrivate
+{
+} FretboardWidgetPrivate;
+
+/* forward declarations */
+gboolean
+_expose_event_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+    g_debug( "expose event callback" );
+    GError* error = NULL;
+
+    GdkGC* gc = gdk_gc_new( widget->window );
+
+    const gchar* frets = CHORD_FRETBOARD(widget)->frets;
+    gdk_gc_set_line_attributes(gc, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_MITER );
+
+    // background
+    gdk_draw_pixbuf( widget->window, gc,
+            CHORD_FRETBOARD(widget)->texture,
+            0,
+            0,
+            30,
+            0,
+            -1,
+            -1,
+            GDK_RGB_DITHER_MAX,
+            0,
+            0);
+
+    // frets
+    for ( int i = 0; i < 6; ++i )
+    {
+        GdkColor fretcolor1 = { 0, 0xff <<8, 0xfb <<8, 0xf7 <<8 };
+        GdkColor fretcolor2 = { 0, 0xc6 <<8, 0xb7 <<8, 0xcd <<8 };
+        GdkColor fretcolor3 = { 0, 0x90 <<8, 0x81 <<8, 0x80 <<8 };
+
+        gdk_gc_set_rgb_fg_color( gc, &fretcolor1 );
+        gdk_draw_line( widget->window, gc, 30 + i*80, 0, 30 + i*80, 256 );
+        gdk_gc_set_rgb_fg_color( gc, &fretcolor2 );
+        gdk_draw_line( widget->window, gc, 32 + i*80, 0, 32 + i*80, 256 );
+        gdk_gc_set_rgb_fg_color( gc, &fretcolor3 );
+        gdk_draw_line( widget->window, gc, 34 + i*80, 0, 34 + i*80, 256 );
+    }
+
+    if ( !frets) return TRUE;
+
+    const gchar strings[] = "EBGDAE";
+
+    PangoContext* context = gtk_widget_get_pango_context( widget );
+    PangoLayout* layout = pango_layout_new( context );
+
+    // strings
+    for ( int i = 0; i < 6; ++i )
+    {
+        GdkColor labeloffcolor = { 0, 0xee <<8, 0xee <<8, 0xee <<8 };
+        GdkColor labeloncolor = { 0, 0x44 <<8, 0x44 <<8, 0x44 <<8 };
+        GdkColor stringcolor1 = { 0, 0xff <<8, 0xfb <<8, 0xa7 <<8 };
+        GdkColor stringcolor2 = { 0, 0xe6 <<8, 0xb7 <<8, 0x2d <<8 };
+        GdkColor stringcolor3 = { 0, 0x90 <<8, 0x41 <<8, 0x00 <<8 };
+
+        if ( frets[5-i] == 'x' || frets[5-i] == 'X' )
+        {
+            gdk_gc_set_rgb_fg_color( gc, &labeloffcolor );
+            pango_layout_set_text( layout, "x", 1 );
+            gdk_gc_set_line_attributes(gc, 2, GDK_LINE_ON_OFF_DASH, GDK_CAP_ROUND, GDK_JOIN_MITER );
+        }
+        else
+        {
+            gdk_gc_set_rgb_fg_color( gc, &labeloncolor );
+            pango_layout_set_text( layout, &strings[i], 1 );
+            gdk_gc_set_line_attributes(gc, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_MITER );
+        }
+        //FIXME take font size into account
+        gdk_draw_layout( widget->window, gc, 0, 20 + 40*i, layout );
+
+        gdk_gc_set_rgb_fg_color( gc, &stringcolor1 );
+        gdk_draw_line( widget->window, gc, 30, 30 + i*40, 470, 30 + i*40 );
+        gdk_gc_set_rgb_fg_color( gc, &stringcolor2 );
+        gdk_draw_line( widget->window, gc, 30, 32 + i*40, 470, 32 + i*40 );
+        gdk_gc_set_rgb_fg_color( gc, &stringcolor3 );
+        gdk_draw_line( widget->window, gc, 30, 34 + i*40, 470, 34 + i*40 );
+    }
+
+    // barree
+    gint barree = 0;
+    gint max = 0;
+    for ( int i = 0; i < 6; ++i )
+    {
+
+
+    gint position = ( frets[5-i] - 0x30 );
+
+            gint position = ( frets[5-i] - 0x30 );
+
+
+    // finger positions
+    for ( int i = 0; i < 6; ++i )
+    {
+        if ( frets[5-i] == 'x' || frets[5-i] == 'X' ) continue;
+        gint position = ( frets[5-i] - 0x30 );
+
+        g_debug( "finger position '%d' = '%d'", i, position );
+
+        if ( position )
+            gdk_draw_pixbuf( widget->window, gc, CHORD_FRETBOARD(widget)->fingerpoint,
+                0, 0,
+                50 + 80*(position-1), 10+40*i,
+                -1, -1,
+                GDK_RGB_DITHER_MAX, 0, 0);
+    }
+    return TRUE;
+}
+
+static void
+fretboard_widget_dispose (GObject *object)
+{
+    if (G_OBJECT_CLASS (fretboard_widget_parent_class)->dispose)
+        G_OBJECT_CLASS (fretboard_widget_parent_class)->dispose (object);
+}
+
+static void
+fretboard_widget_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (fretboard_widget_parent_class)->finalize (object);
+}
+
+static void
+fretboard_widget_class_init (FretboardWidgetClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+    /* register private data */
+    g_type_class_add_private (klass, sizeof (FretboardWidgetPrivate));
+
+    /* hook virtual methods */
+    /* ... */
+
+    /* install properties */
+    /* ... */
+
+    object_class->dispose = fretboard_widget_dispose;
+    object_class->finalize = fretboard_widget_finalize;
+}
+
+static void
+fretboard_widget_init (FretboardWidget *self)
+{
+    GError* error = NULL;
+    self->texture = gdk_pixbuf_new_from_file( RESOURCE_PATH "wood.png", &error );
+    self->fingerpoint = gdk_pixbuf_new_from_file( RESOURCE_PATH "ball.png", &error );
+
+    gtk_widget_set_size_request(self, 450, 270);
+    g_signal_connect (G_OBJECT(self), "expose_event",
+                      G_CALLBACK(_expose_event_callback), NULL);
+
+    //FIXME find out how to make the background of the GdkDrawingArea transparent...
+    gtk_widget_set_name( GTK_WIDGET(self), "mokopanedwindow-lower-enclosing" );
+}
+
+FretboardWidget*
+fretboard_widget_new (void)
+{
+    return g_object_new (CHORD_TYPE_FRETBOARD, NULL);
+}
+
+void fretboard_widget_set_frets(FretboardWidget* self, const gchar* frets)
+{
+    //g_free( self->frets ); self->frets = g_strdup( frets );
+    self->frets = frets;
+}


Property changes on: trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.c
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.h	2006-11-01 22:36:36 UTC (rev 174)
+++ trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.h	2006-11-02 13:17:39 UTC (rev 175)
@@ -0,0 +1,55 @@
+/*  fretboard-widget.h
+ *
+ *  Authored By Michael 'Mickey' Lauer <mlauer at vanille-media.de>
+ *
+ *  Copyright (C) 2006 Vanille-Media
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: mickey $]
+ */
+
+#ifndef _CHORD_FRETBOARD_H_
+#define _CHORD_FRETBOARD_H_
+
+#include <gtk/gtkdrawingarea.h>
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define CHORD_TYPE_FRETBOARD fretboard_widget_get_type()
+#define CHORD_FRETBOARD(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj),     CHORD_TYPE_FRETBOARD, FretboardWidget))
+#define CHORD_FRETBOARD_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass),     CHORD_TYPE_FRETBOARD, FretboardWidgetClass))
+#define CHORD_IS_FRETBOARD(obj)     (G_TYPE_CHECK_INSTANCE_TYPE ((obj),     CHORD_TYPE_FRETBOARD))
+#define CHORD_IS_FRETBOARD_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass),     CHORD_TYPE_FRETBOARD))
+#define CHORD_FRETBOARD_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj),     CHORD_TYPE_FRETBOARD, FretboardWidgetClass))
+
+typedef struct {
+    GtkDrawingArea parent;
+    GdkPixbuf* texture;
+    GdkPixbuf* fingerpoint;
+    gchar* frets;
+} FretboardWidget;
+
+typedef struct {
+    GtkDrawingAreaClass parent_class;
+} FretboardWidgetClass;
+
+GType fretboard_widget_get_type (void);
+
+FretboardWidget* fretboard_widget_new (void);
+
+void fretboard_widget_set_frets(FretboardWidget* self, const gchar* frets);
+
+G_END_DECLS
+
+#endif // _CHORD_FRETBOARD_H_
+


Property changes on: trunk/src/target/OM-2007/applications/openmoko-chordmaster/fretboard-widget.h
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/src/target/OM-2007/applications/openmoko-chordmaster/main.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-chordmaster/main.c	2006-11-01 22:36:36 UTC (rev 174)
+++ trunk/src/target/OM-2007/applications/openmoko-chordmaster/main.c	2006-11-02 13:17:39 UTC (rev 175)
@@ -19,6 +19,7 @@
 
 #include "callbacks.h"
 #include "chordsdb.h"
+#include "fretboard-widget.h"
 #include "main.h"
 
 #include <mokoui/moko-application.h>
@@ -34,12 +35,6 @@
 #include <gtk/gtkscrolledwindow.h>
 #include <gtk/gtktreeview.h>
 
-enum {
-    COLUMN_NAME,
-    COLUMN_FRETS,
-    NUM_COLS,
-};
-
 int main( int argc, char** argv )
 {
     g_debug( "openmoko-chordmaster starting up" );
@@ -108,11 +103,12 @@
     /* tool bar */
     MokoToolBox* toolbox;
     toolbox = MOKO_TOOL_BOX(moko_tool_box_new_with_search());
+    gtk_widget_grab_focus( GTK_WIDGET(toolbox) );
 
     button1 = moko_tool_box_add_action_button( toolbox );
-    gtk_button_set_label( button1, "Action 1" );
+    gtk_button_set_label( button1, "Add" );
     button2 = moko_tool_box_add_action_button( toolbox );
-    gtk_button_set_label( button2, "Action 2" );
+    gtk_button_set_label( button2, "Remove" );
     button3 = moko_tool_box_add_action_button( toolbox );
     gtk_button_set_label( button3, "ActMenu" );
     button4 = moko_tool_box_add_action_button( toolbox );
@@ -184,57 +180,20 @@
 
     GtkScrolledWindow* scrollwin = gtk_scrolled_window_new( NULL, NULL );
     //FIXME get from style or (even better) set as initial size hint in MokoPanedWindow (also via style sheet of course)
-    gtk_widget_set_size_request( GTK_WIDGET(scrollwin), 0, 170 );
+    gtk_widget_set_size_request( GTK_WIDGET(scrollwin), 0, 230 );
     gtk_scrolled_window_set_policy( scrollwin, GTK_POLICY_NEVER, GTK_POLICY_ALWAYS );
 
+    g_object_set( G_OBJECT(view), "can-focus", FALSE, NULL );
+
     gtk_scrolled_window_add_with_viewport( scrollwin, GTK_WIDGET(view) );
     moko_paned_window_set_upper_pane( d->window, GTK_WIDGET(scrollwin) );
+
+    GtkTreeSelection* selection = gtk_tree_view_get_selection( view );
+    g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(cb_cursor_changed), d );
 }
 
-gboolean
-        expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data);
-
 void populate_details_area( ChordMasterData* d )
 {
-/*    GtkImage* image = gtk_image_new_from_file( RESOURCE_PATH "fretboard.png" );
-    GdkPixbuf* pixbuf = gtk_image_get_pixbuf( image );*/
-
-    GtkWidget* drawing_area = gtk_drawing_area_new ();
-    gtk_widget_set_size_request (drawing_area, 450, 348);
-    g_signal_connect (G_OBJECT (drawing_area), "expose_event",
-                      G_CALLBACK (expose_event_callback), NULL);
-
-    
-    moko_paned_window_set_lower_pane( d->window, GTK_WIDGET(drawing_area) );
+    d->fretboard = fretboard_widget_new();
+    moko_paned_window_set_lower_pane( d->window, GTK_WIDGET(d->fretboard) );
 }
-
-/* fretboard widget */
-
-gboolean
-        expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
-{
-    g_debug( "expose event callback" );
-    GError* error = NULL;
-
-    GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file( RESOURCE_PATH "fretboard.png", &error );
-    gdk_draw_pixbuf( widget->window, 
-                     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
-            pixbuf,
-            0,
-            0,
-            20,
-            0,
-            -1,
-            -1,
-            GDK_RGB_DITHER_MAX,
-            0,
-            0);
-
-    /*gdk_draw_arc (widget->window,
-                  widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
-                  TRUE,
-                  0, 0, widget->allocation.width, widget->allocation.height,
-                  0, 64 * 360);*/
-    return TRUE;
-}
-

Modified: trunk/src/target/OM-2007/applications/openmoko-chordmaster/main.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-chordmaster/main.h	2006-11-01 22:36:36 UTC (rev 174)
+++ trunk/src/target/OM-2007/applications/openmoko-chordmaster/main.h	2006-11-02 13:17:39 UTC (rev 175)
@@ -17,7 +17,11 @@
  *  Current Version: $Rev$ ($Date$) [$Author$]
  */
 
+#ifndef __MAIN__H_
+#define __MAIN__H_
+
 #include "chordsdb.h"
+#include "fretboard-widget.h"
 
 #include <mokoui/moko-application.h>
 #include <mokoui/moko-paned-window.h>
@@ -29,8 +33,17 @@
     GtkMenu* menu;
     MokoToolBox* toolbox;
     ChordsDB* chordsdb;
+    FretboardWidget* fretboard;
 } ChordMasterData;
 
+enum {
+    COLUMN_NAME,
+    COLUMN_FRETS,
+    NUM_COLS,
+};
+
 void setup_ui( ChordMasterData* );
 void populate_navigation_area( ChordMasterData* d );
 void populate_details_area( ChordMasterData* d );
+
+#endif

Modified: trunk/src/target/OM-2007/applications/openmoko-chordmaster/openmoko-chordmaster.pro
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-chordmaster/openmoko-chordmaster.pro	2006-11-01 22:36:36 UTC (rev 174)
+++ trunk/src/target/OM-2007/applications/openmoko-chordmaster/openmoko-chordmaster.pro	2006-11-02 13:17:39 UTC (rev 175)
@@ -1,6 +1,6 @@
 MOKOCONFIG = mokoui
 
-HEADERS = callbacks.h chordsdb.h main.h
-SOURCES = callbacks.c chordsdb.c main.c
+HEADERS = callbacks.h chordsdb.h fretboard-widget.h main.h
+SOURCES = callbacks.c chordsdb.c fretboard-widget.c main.c
 
 include ( $(OPENMOKODIR)/devel/qmake/openmoko-include.pro )

Added: trunk/src/target/OM-2007/applications/openmoko-chordmaster/wood.png
===================================================================
(Binary files differ)


Property changes on: trunk/src/target/OM-2007/applications/openmoko-chordmaster/wood.png
___________________________________________________________________
Name: svn:mime-type
   + image/png





More information about the commitlog mailing list