The following commit has been merged in the master branch:
commit 6bc36a05c679303088e714c55365314fae72904d
Author: Andrei Zavada <[email protected]>
Date:   Tue Jan 15 00:16:00 2013 +0200

    patterns WIP

diff --git a/src/ui/sf/sf-construct.cc b/src/ui/sf/sf-construct.cc
index d7c1e53..f03c414 100644
--- a/src/ui/sf/sf-construct.cc
+++ b/src/ui/sf/sf-construct.cc
@@ -419,7 +419,9 @@ SScoringFacilityWidgets (SExpDesignUI& _p)
                G_CONNECT_1 (ePatternChannel, changed);
 
        G_CONNECT_1 (daPatternSelection, draw);
-       G_CONNECT_2( daPatternSelection, scroll, event);
+       G_CONNECT_2 (daPatternSelection, scroll, event);
+       G_CONNECT_1 (daPatternField, draw);
+       G_CONNECT_2 (daPatternField, scroll, event);
        G_CONNECT_1 (bPatternSave, clicked);
        G_CONNECT_1 (bPatternDiscard, clicked);
 
diff --git a/src/ui/sf/sf-montage.cc b/src/ui/sf/sf-montage.cc
index b3d11d5..0f5010f 100644
--- a/src/ui/sf/sf-montage.cc
+++ b/src/ui/sf/sf-montage.cc
@@ -276,7 +276,8 @@ draw_page( cairo_t *cr,
                                                me-ma, ma, y0, 
signal_display_scale);
                                        aghui::cairo_draw_signal(
                                                cr, env_l, 0, env_l.size(),
-                                               me-ma, ma, y0, 
signal_display_scale, 1, aghui::TDrawSignalDirection::Backward, true);
+                                               me-ma, ma, y0, 
signal_display_scale,
+                                               1, 
aghui::TDrawSignalDirection::backward, true);
                                        cairo_close_path( cr);
                                        cairo_fill( cr);
                                        cairo_stroke( cr);
diff --git a/src/ui/sf/sf-patterns.cc b/src/ui/sf/sf-patterns.cc
index bc48b0c..11fb626 100644
--- a/src/ui/sf/sf-patterns.cc
+++ b/src/ui/sf/sf-patterns.cc
@@ -64,30 +64,36 @@ void
 aghui::SScoringFacility::SFindDialog::
 search()
 {
-       if ( field_channel && thing.size() > 0 ) {
-               if ( !(Pp == Pp2) || field_channel != field_channel_saved) {
-                       Pp2 = Pp;
-                       field_channel_saved = field_channel;
-               }
-               cpattern = new pattern::CPattern<TFloat>
-                       ({thing, field_channel->samplerate()},
-                        context_before, context_after,
-                        Pp);
-               diff_line =
-                 (cpattern->do_search(
+       if ( unlikely (not field_channel or thing.size() == 0) )
+               return;
+
+       if ( !(Pp == Pp2) || field_channel != field_channel_saved) {
+               Pp2 = Pp;
+               field_channel_saved = field_channel;
+       }
+       cpattern = new pattern::CPattern<TFloat>
+               ({thing, field_channel->samplerate()},
+                context_before, context_after,
+                Pp);
+       diff_line =
+               (cpattern->do_search(
                        field_channel->signal_envelope( Pp.env_tightness).first,
                        field_channel->signal_envelope( 
Pp.env_tightness).second,
                        field_channel->signal_bandpass( Pp.bwf_ffrom, 
Pp.bwf_fupto, Pp.bwf_order),
                        field_channel->signal_dzcdf( Pp.dzcdf_step, 
Pp.dzcdf_sigma, Pp.dzcdf_smooth),
                        increment * samplerate),
-                  cpattern->diff);
-
-               delete cpattern;
-               cpattern = nullptr;
-
-               gtk_widget_set_visible( (GtkWidget*)_p.daPatternField, TRUE);
-               gtk_widget_set_visible( (GtkWidget*)_p.bPatternSearch, FALSE);
-       }
+                cpattern->diff);
+
+       delete cpattern;
+       cpattern = nullptr;
+
+       set_field_da_width( _p.total_pages() * 3);
+       field_display_scale =
+               agh::alg::calibrate_display_scale(
+                       field_channel->psd.course, _p.total_pages(),
+                       da_field_ht);
+       gtk_widget_set_visible( (GtkWidget*)_p.daPatternField, TRUE);
+       gtk_widget_set_visible( (GtkWidget*)_p.bPatternSearch, FALSE);
 }
 
 
@@ -113,12 +119,26 @@ aghui::SScoringFacility::SFindDialog::
 set_pattern_da_width( int width)
 {
        g_object_set( (GObject*)_p.daPatternSelection,
-                     "width-request", da_wd = width,
-                     "height-request", da_ht,
+                     "width-request", da_thing_wd = width,
+                     "height-request", da_thing_ht,
                      NULL);
        g_object_set( (GObject*)_p.vpPatternSelection,
                      "width-request", min( width+5, 600),
-                     "height-request", da_ht + 30,
+                     "height-request", da_thing_ht + 30,
+                     NULL);
+}
+
+void
+aghui::SScoringFacility::SFindDialog::
+set_field_da_width( int width)
+{
+       g_object_set( (GObject*)_p.daPatternField,
+                     "width-request", da_field_wd = width,
+                     "height-request", da_field_ht,
+                     NULL);
+       g_object_set( (GObject*)_p.vpPatternField,
+                     "width-request", min( width+5, 600),
+                     "height-request", da_thing_ht + 30,
                      NULL);
 }
 
@@ -130,7 +150,7 @@ draw_thing( cairo_t *cr)
 {
        if ( thing.size() == 0 ) {
                set_pattern_da_width( 200);
-               aghui::cairo_put_banner( cr, da_wd, da_ht, "(no selection)");
+               aghui::cairo_put_banner( cr, da_thing_wd, da_thing_ht, "(no 
selection)");
                enable_controls( false);
                return;
        } else {
@@ -144,14 +164,14 @@ draw_thing( cairo_t *cr)
        for ( size_t i8 = 0; (float)i8 / 8 < seconds; ++i8 ) {
                _p._p.CwB[SExpDesignUI::TColour::sf_ticks].set_source_rgba( cr);
                cairo_set_line_width( cr, (i8%8 == 0) ? 1. : (i8%4 == 0) ? .6 : 
.3);
-               guint x = (float)i8/8 / seconds * da_wd;
+               guint x = (float)i8/8 / seconds * da_thing_wd;
                cairo_move_to( cr, x, 0);
-               cairo_rel_line_to( cr, 0, da_ht);
+               cairo_rel_line_to( cr, 0, da_thing_ht);
                cairo_stroke( cr);
 
                if ( i8 % 8 == 0 ) {
                        
_p._p.CwB[SExpDesignUI::TColour::sf_labels].set_source_rgba( cr);
-                       cairo_move_to( cr, x + 5, da_ht-2);
+                       cairo_move_to( cr, x + 5, da_thing_ht-2);
                        snprintf_buf( "%g", (float)i8/8);
                        cairo_show_text( cr, __buf__);
                        cairo_stroke( cr);
@@ -164,15 +184,15 @@ draw_thing( cairo_t *cr)
        cairo_set_source_rgb( cr, 0., 0., 0.);
        cairo_set_line_width( cr, .8);
        aghui::cairo_draw_signal( cr, thing, 0, thing.size(),
-                                 da_wd, 0, da_ht/3, display_scale);
+                                 da_thing_wd, 0, da_thing_ht/3, 
thing_display_scale);
        cairo_stroke( cr);
 
        // lines marking out context
        cairo_set_source_rgba( cr, 0.9, 0.9, 0.9, .5);
        cairo_set_line_width( cr, 1.);
-       cairo_rectangle( cr, 0., 0., (float)context_before / thing.size() * 
da_wd, da_ht);
-       cairo_rectangle( cr, (float)(context_before + run) / thing.size() * 
da_wd, 0,
-                        (float)(context_after) / thing.size() * da_wd, da_ht);
+       cairo_rectangle( cr, 0., 0., (float)context_before / thing.size() * 
da_thing_wd, da_thing_ht);
+       cairo_rectangle( cr, (float)(context_before + run) / thing.size() * 
da_thing_wd, 0,
+                        (float)(context_after) / thing.size() * da_thing_wd, 
da_thing_ht);
        cairo_fill( cr);
        cairo_stroke( cr);
 
@@ -186,7 +206,7 @@ draw_thing( cairo_t *cr)
                        if ( sigproc::envelope( {thing, samplerate}, 
Pp.env_tightness,
                                                1./samplerate,
                                                &env_l, &env_u) == 0 ) {
-                               aghui::cairo_put_banner( cr, da_wd, da_ht, 
"Selection is too short");
+                               aghui::cairo_put_banner( cr, da_thing_wd, 
da_thing_ht, "Selection is too short");
                                enable_controls( false);
                                goto out;
                        }
@@ -194,9 +214,10 @@ draw_thing( cairo_t *cr)
 
                        
_p._p.CwB[SExpDesignUI::TColour::sf_selection].set_source_rgba_contrasting( cr, 
.3);
                        aghui::cairo_draw_signal( cr, env_u, 0, env_u.size(),
-                                                 da_wd, 0, da_ht/3, 
display_scale);
+                                                 da_thing_wd, 0, 
da_thing_ht/2, thing_display_scale);
                        aghui::cairo_draw_signal( cr, env_l, 0, env_l.size(),
-                                                 da_wd, 0, da_ht/3, 
display_scale, 1, aghui::TDrawSignalDirection::Backward, true);
+                                                 da_thing_wd, 0, 
da_thing_ht/2, thing_display_scale, 1,
+                                                 
aghui::TDrawSignalDirection::backward, true);
                        cairo_close_path( cr);
                        cairo_fill( cr);
                        cairo_stroke( cr);
@@ -205,7 +226,7 @@ draw_thing( cairo_t *cr)
              // target frequency
                {
                        if ( Pp.bwf_ffrom >= Pp.bwf_fupto ) {
-                               aghui::cairo_put_banner( cr, da_wd, da_ht, "Bad 
band-pass range");
+                               aghui::cairo_put_banner( cr, da_thing_wd, 
da_thing_ht, "Bad band-pass range");
                                enable_controls( false);
                                goto out;
                        }
@@ -216,19 +237,19 @@ draw_thing( cairo_t *cr)
                        cairo_set_source_rgba( cr, 0.3, 0.3, 0.3, .5);
                        cairo_set_line_width( cr, 3.);
                        aghui::cairo_draw_signal( cr, course, 0, course.size(),
-                                                 da_wd, 0, da_ht/3, 
display_scale);
+                                                 da_thing_wd, 0, 
da_thing_ht/3, thing_display_scale);
                        cairo_stroke( cr);
                }
 
              // dzcdf
                {
                        if ( samplerate < 10 ) {
-                               aghui::cairo_put_banner( cr, da_wd, da_ht, 
"Samplerate is too low");
+                               aghui::cairo_put_banner( cr, da_thing_wd, 
da_thing_ht, "Samplerate is too low");
                                enable_controls( false);
                                goto out;
                        }
                        if ( Pp.dzcdf_step * 10 > pattern_length() ) { // 
require at least 10 dzcdf points
-                               aghui::cairo_put_banner( cr, da_wd, da_ht, 
"Selection is too short");
+                               aghui::cairo_put_banner( cr, da_thing_wd, 
da_thing_ht, "Selection is too short");
                                enable_controls( false);
                                goto out;
                        }
@@ -236,32 +257,15 @@ draw_thing( cairo_t *cr)
 
                        dzcdf = sigproc::dzcdf( sigproc::SSignalRef<TFloat> 
{thing, samplerate},
                                                Pp.dzcdf_step, Pp.dzcdf_sigma, 
Pp.dzcdf_smooth);
-                       float   dzcdf_display_scale = da_ht/4. / dzcdf.max();
+                       float   dzcdf_display_scale = da_thing_ht/4. / 
dzcdf.max();
 
                        cairo_set_source_rgba( cr, 0.3, 0.3, 0.99, .8);
                        cairo_set_line_width( cr, 1.);
                        aghui::cairo_draw_signal( cr, dzcdf, 0, dzcdf.size(),
-                                                 da_wd, 0, da_ht/2-5, 
dzcdf_display_scale);
-                       cairo_stroke( cr);
-                       cairo_set_line_width( cr, .5);
-                       cairo_rectangle( cr, 0, da_ht/2-5, da_wd, da_ht/2-4);
+                                                 da_thing_wd, 0, 
da_thing_ht/2-5, dzcdf_display_scale);
                        cairo_stroke( cr);
                }
        }
-
-       // report any occurrences
-       
-       //if ( last_find != (size_t)-1 ) {
-       //      cairo_set_source_rgba( cr, 0.1, 0.1, 0.1, .9);
-       //      cairo_set_line_width( cr, .7);
-       //      aghui::cairo_draw_signal( cr, field_channel->signal_filtered,
-       //                                last_find - context_before, last_find 
+ run + context_after,
-       //                                da_wd, 0, da_ht*2/3, display_scale);
-       //      cairo_stroke( cr);
-       // }
-
-
-
 out:
        ;
 }
@@ -270,6 +274,11 @@ void
 aghui::SScoringFacility::SFindDialog::
 draw_field( cairo_t *cr)
 {
+       aghui::cairo_draw_signal(
+               cr,
+               field_channel->psd.course, 0, field_channel->psd.course.size(),
+               da_field_wd, 0., da_field_ht/2, field_display_scale);
+
 }
 
 
@@ -296,7 +305,7 @@ load_pattern( SScoringFacility::SChannel& field)
                                                full_sample, 1) ];
                                // or _p.selection_*
        samplerate = field.samplerate();
-       display_scale = field.signal_display_scale;
+       thing_display_scale = field.signal_display_scale;
 
        set_pattern_da_width( full_sample / field.spp());
 
@@ -369,7 +378,7 @@ load_pattern( const char *label, bool do_globally)
                                context_after  *= fac;
                        }
 
-                       display_scale = field_channel->signal_display_scale;
+                       thing_display_scale = 
field_channel->signal_display_scale;
                        W_V.up();
 
                        set_pattern_da_width( full_sample / 
field_channel->spp());
diff --git a/src/ui/sf/sf-patterns_cb.cc b/src/ui/sf/sf-patterns_cb.cc
index 8a1b968..4721f4c 100644
--- a/src/ui/sf/sf-patterns_cb.cc
+++ b/src/ui/sf/sf-patterns_cb.cc
@@ -54,16 +54,45 @@ daPatternSelection_scroll_event_cb( GtkWidget *wid, 
GdkEventScroll *event, gpoin
        switch ( event->direction ) {
        case GDK_SCROLL_UP:
                if ( event->state & GDK_SHIFT_MASK )
-                       FD.set_pattern_da_width( FD.da_wd + 10);
+                       FD.set_pattern_da_width( FD.da_thing_wd + 10);
                else
-                       FD.display_scale *= 1.05;
+                       FD.thing_display_scale *= 1.05;
            break;
        case GDK_SCROLL_DOWN:
                if ( event->state & GDK_SHIFT_MASK ) {
-                       if ( FD.da_wd > 20 )
-                               FD.set_pattern_da_width( FD.da_wd - 10);
+                       if ( FD.da_thing_wd > 20 )
+                               FD.set_pattern_da_width( FD.da_thing_wd - 10);
                } else
-                       FD.display_scale /= 1.05;
+                       FD.thing_display_scale /= 1.05;
+           break;
+       default:
+           break;
+       }
+
+       gtk_widget_queue_draw( wid);
+
+       return TRUE;
+}
+
+gboolean
+daPatternField_scroll_event_cb( GtkWidget *wid, GdkEventScroll *event, 
gpointer userdata)
+{
+       auto& SF = *(SScoringFacility*)userdata;
+       auto& FD = SF.find_dialog;
+
+       switch ( event->direction ) {
+       case GDK_SCROLL_UP:
+               if ( event->state & GDK_SHIFT_MASK )
+                       FD.set_field_da_width( FD.da_field_wd + 10);
+               else
+                       FD.field_display_scale *= 1.05;
+           break;
+       case GDK_SCROLL_DOWN:
+               if ( event->state & GDK_SHIFT_MASK ) {
+                       if ( FD.da_field_wd > 20 )
+                               FD.set_field_da_width( FD.da_field_wd - 10);
+               } else
+                       FD.field_display_scale /= 1.05;
            break;
        default:
            break;
diff --git a/src/ui/sf/sf-phasediff.cc b/src/ui/sf/sf-phasediff.cc
index 57a311f..7a3b2bc 100644
--- a/src/ui/sf/sf-phasediff.cc
+++ b/src/ui/sf/sf-phasediff.cc
@@ -134,23 +134,17 @@ draw( cairo_t* cr, int wd, int ht)
        cairo_stroke( cr);
 
        if ( channel1 == channel2 ) {
-               cairo_move_to( cr, 5, 15);
-               cairo_show_text( cr, "Same channel");
-               cairo_stroke( cr);
+               aghui::cairo_put_banner( cr, wd, ht, "Same channel");
                return;
        }
 
        if ( course.size() == 0 ) {
-               cairo_move_to( cr, 5, 15);
-               cairo_show_text( cr, "Huh?");
-               cairo_stroke( cr);
+               aghui::cairo_put_banner( cr, wd, ht, "Huh?");
                return;
        }
 
        if ( channel1->samplerate() != channel2->samplerate() ) {
-               cairo_move_to( cr, 5, 15);
-               cairo_show_text( cr, "Incompatible channels (different 
samplerate)");
-               cairo_stroke( cr);
+               aghui::cairo_put_banner( cr, wd, ht, "Incompatible channels 
(different samplerate)");
                return;
        }
 
diff --git a/src/ui/sf/sf.hh b/src/ui/sf/sf.hh
index 48b5ef6..878dc20 100644
--- a/src/ui/sf/sf.hh
+++ b/src/ui/sf/sf.hh
@@ -547,7 +547,8 @@ class SScoringFacility
                bool    draw_details:1;
                void draw_thing( cairo_t*);
                void draw_field( cairo_t*);
-               float   display_scale;
+               float   thing_display_scale,
+                       field_display_scale;
 
              // widgets
                SUIVarCollection
@@ -559,9 +560,12 @@ class SScoringFacility
                void enable_controls( bool);
 
                static const int
-                       da_ht = 280;
-               int     da_wd;
+                       da_thing_ht = 220,
+                       da_field_ht = 230;
+               int     da_thing_wd,
+                       da_field_wd;
                void set_pattern_da_width( int);
+               void set_field_da_width( int);
 
                SScoringFacility&
                        _p;
diff --git a/src/ui/sf/sf_cb.hh b/src/ui/sf/sf_cb.hh
index 94066b5..d456ebf 100644
--- a/src/ui/sf/sf_cb.hh
+++ b/src/ui/sf/sf_cb.hh
@@ -152,6 +152,7 @@ void iSFScoreClear_activate_cb( GtkMenuItem*, gpointer);
 void ePatternList_changed_cb( GtkComboBox*, gpointer);
 void ePatternChannel_changed_cb( GtkComboBox*, gpointer);
 gboolean daPatternField_draw_cb( GtkWidget*, cairo_t*, gpointer);
+gboolean daPatternField_scroll_event_cb( GtkWidget*, GdkEventScroll*, 
gpointer);
 gboolean daPatternSelection_draw_cb( GtkWidget*, cairo_t*, gpointer);
 gboolean daPatternSelection_scroll_event_cb( GtkWidget*, GdkEventScroll*, 
gpointer);
 void bPatternSearch_clicked_cb( GtkButton*, gpointer);
diff --git a/src/ui/ui.hh b/src/ui/ui.hh
index 8aed21a..5fc15b6 100644
--- a/src/ui/ui.hh
+++ b/src/ui/ui.hh
@@ -121,14 +121,15 @@ void gtk_cell_layout_set_renderer( GtkComboBox*);
 
 
 
-enum TDrawSignalDirection { Forward, Backward };
+enum TDrawSignalDirection { forward, backward };
+
 void
-cairo_draw_signal( cairo_t *cr,
-                  const valarray<TFloat>& signal,
+cairo_draw_signal( cairo_t*,
+                  const valarray<TFloat>&,
                   ssize_t start, ssize_t end,
                   size_t da_wd, double hdisp, double vdisp, float 
display_scale,
                   unsigned short decimate = 1,
-                  TDrawSignalDirection direction = 
TDrawSignalDirection::Forward,
+                  TDrawSignalDirection direction = 
TDrawSignalDirection::forward,
                   bool continue_path = false);
 
 inline void
@@ -137,7 +138,7 @@ cairo_draw_signal( cairo_t *cr,
                   ssize_t start, ssize_t end,
                   size_t width, double hdisp, double vdisp, float 
display_scale,
                   unsigned short decimate = 1,
-                  TDrawSignalDirection direction = 
TDrawSignalDirection::Forward,
+                  TDrawSignalDirection direction = 
TDrawSignalDirection::forward,
                   bool continue_path = false)
 {
        valarray<TFloat> tmp (end - start); // avoid copying other rows, cols

-- 
Sleep experiment manager

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to