The following commit has been merged in the master branch:
commit 2664c84f6b68f94065fb25e2d1e9fe53b67f47f1
Author: Andrei Zavada <[email protected]>
Date:   Sun Feb 3 13:31:06 2013 +0200

    bundled glade-bound commit for SF improvements
    
    - check menu items for various phasic events;
    - annotation navigation and clear-all;
    - annotation type selection;

diff --git a/data/sf.glade b/data/sf.glade
index 41c8a12..4fd528f 100644
--- a/data/sf.glade
+++ b/data/sf.glade
@@ -122,6 +122,44 @@
               </object>
             </child>
             <child>
+              <object class="GtkMenuItem" id="iiSFPagePhasicEvents">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Pha_sic 
events</property>
+                <property name="use_underline">True</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="menu6">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkCheckMenuItem" 
id="iSFPageDrawPhasicEyeBlinks">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">_Eye 
blinks</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkCheckMenuItem" 
id="iSFPageDrawPhasicSpindles">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">_Spindles</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkCheckMenuItem" 
id="iSFPageDrawPhasicKComplexes">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" 
translatable="yes">_K-complexes</property>
+                        <property name="use_underline">True</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
               <object class="GtkSeparatorMenuItem" id="menuitem2">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
@@ -202,22 +240,24 @@
       </object>
     </child>
     <child>
-      <object class="GtkSeparatorMenuItem" id="iSFPageAnnotationSeparator">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-      </object>
-    </child>
-    <child>
       <object class="GtkMenuItem" id="iiSFPageAnnotation">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="label" translatable="yes">_Annotation</property>
+        <property name="label" translatable="yes">_Annotations</property>
         <property name="use_underline">True</property>
         <child type="submenu">
           <object class="GtkMenu" id="menu2">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <child>
+              <object class="GtkMenuItem" id="iSFPageAnnotationEdit">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">_Edit...</property>
+                <property name="use_underline">True</property>
+              </object>
+            </child>
+            <child>
               <object class="GtkMenuItem" id="iSFPageAnnotationDelete">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
@@ -226,10 +266,38 @@
               </object>
             </child>
             <child>
-              <object class="GtkMenuItem" id="iSFPageAnnotationEdit">
+              <object class="GtkSeparatorMenuItem" 
id="iSFPageAnnotationSeparator">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="label" translatable="yes">_Edit...</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="iSFPageAnnotationClearAll">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">_Clear 
All...</property>
+                <property name="use_underline">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorMenuItem" id="menuitem4">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="iSFPageAnnotationGotoPrev">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">_Previous</property>
+                <property name="use_underline">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="iSFPageAnnotationGotoNext">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">_Next</property>
                 <property name="use_underline">True</property>
               </object>
             </child>
@@ -365,36 +433,6 @@
         </child>
       </object>
     </child>
-    <child>
-      <object class="GtkMenuItem" id="iiSFPagePhasicEvents">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">Pha_sic events</property>
-        <property name="use_underline">True</property>
-        <child type="submenu">
-          <object class="GtkMenu" id="menu6">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <child>
-              <object class="GtkCheckMenuItem" id="iSFPageDrawPhasicSpindles">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes">_Spindles</property>
-                <property name="use_underline">True</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkCheckMenuItem" 
id="iSFPageDrawPhasicKComplexes">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" 
translatable="yes">_K-complexes</property>
-                <property name="use_underline">True</property>
-              </object>
-            </child>
-          </object>
-        </child>
-      </object>
-    </child>
   </object>
   <object class="GtkMenu" id="iiSFPageHidden">
     <property name="visible">True</property>
@@ -729,6 +767,7 @@
   </object>
   <object class="GtkWindow" id="wSF">
     <property name="can_focus">False</property>
+    <property name="events">GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK</property>
     <property name="title" translatable="yes">Aghermann Scoring 
Facility</property>
     <property name="window_position">center</property>
     <property name="default_width">1024</property>
@@ -1192,15 +1231,15 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkButton" id="bSFScoreWake">
-                        <property name="label" translatable="yes">☺</property>
+                      <object class="GtkButton" id="bSFScoreClear">
+                        <property name="label" translatable="yes">⌫</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
-                        <property name="tooltip_markup" 
translatable="yes">Wake (&lt;b&gt;w&lt;/b&gt;)</property>
+                        <property name="tooltip_markup" 
translatable="yes">Clear (&lt;b&gt;q&lt;/b&gt;)</property>
                         <property name="valign">center</property>
                         <property name="focus_on_click">False</property>
-                        <accelerator key="w" signal="activate"/>
+                        <accelerator key="q" signal="activate"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -1209,15 +1248,15 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkButton" id="bSFScoreClear">
-                        <property name="label" translatable="yes">⌫</property>
+                      <object class="GtkButton" id="bSFScoreWake">
+                        <property name="label" translatable="yes">☺</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
-                        <property name="tooltip_markup" 
translatable="yes">Clear (&lt;b&gt;q&lt;/b&gt;)</property>
+                        <property name="tooltip_markup" 
translatable="yes">Wake (&lt;b&gt;w&lt;/b&gt;)</property>
                         <property name="valign">center</property>
                         <property name="focus_on_click">False</property>
-                        <accelerator key="q" signal="activate"/>
+                        <accelerator key="w" signal="activate"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -1452,17 +1491,18 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkToggleButton" 
id="bSFShowPhaseDiffDialog">
-                        <property name="label" translatable="yes">Δφ</property>
+                      <object class="GtkToggleButton" id="bSFShowFindDialog">
+                        <property name="label" 
translatable="yes">_Find</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
                         <property name="has_tooltip">True</property>
-                        <property name="tooltip_markup" 
translatable="yes">Interchannel signal shift (&lt;b&gt;F4&lt;/b&gt;)</property>
-                        <property name="tooltip_text" 
translatable="yes">Interchannel signal shift (F4)</property>
+                        <property name="tooltip_markup" 
translatable="yes">Find/manage patterns (&lt;b&gt;F3&lt;/b&gt;)</property>
+                        <property name="tooltip_text" 
translatable="yes">Find/manage patterns (F3)</property>
                         <property name="valign">center</property>
+                        <property name="use_underline">True</property>
                         <property name="focus_on_click">False</property>
-                        <accelerator key="F4" signal="activate"/>
+                        <accelerator key="F3" signal="activate"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -1472,18 +1512,17 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkToggleButton" id="bSFShowFindDialog">
-                        <property name="label" 
translatable="yes">_Find</property>
+                      <object class="GtkToggleButton" 
id="bSFShowPhaseDiffDialog">
+                        <property name="label" translatable="yes">Δφ</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="receives_default">True</property>
                         <property name="has_tooltip">True</property>
-                        <property name="tooltip_markup" 
translatable="yes">Find/manage patterns (&lt;b&gt;F3&lt;/b&gt;)</property>
-                        <property name="tooltip_text" 
translatable="yes">Find/manage patterns (F3)</property>
+                        <property name="tooltip_markup" 
translatable="yes">Interchannel signal shift (&lt;b&gt;F4&lt;/b&gt;)</property>
+                        <property name="tooltip_text" 
translatable="yes">Interchannel signal shift (F4)</property>
                         <property name="valign">center</property>
-                        <property name="use_underline">True</property>
                         <property name="focus_on_click">False</property>
-                        <accelerator key="F3" signal="activate"/>
+                        <accelerator key="F4" signal="activate"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -2285,7 +2324,40 @@ skew:    𝑔(𝑢) = 𝑢2</property>
       <object class="GtkBox" id="dialog-vbox4">
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkFrame" id="frame1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkEntry" id="eSFAnnotationLabel">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="margin_top">5</property>
+                <property name="margin_bottom">5</property>
+                <property name="max_length">120</property>
+                <property name="invisible_char">•</property>
+                <property name="activates_default">True</property>
+                <property name="invisible_char_set">True</property>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">&lt;b&gt;Annotation 
name&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
         <child internal-child="action_area">
           <object class="GtkButtonBox" id="dialog-action_area4">
             <property name="can_focus">False</property>
@@ -2329,47 +2401,104 @@ skew:  𝑔(𝑢) = 𝑢2</property>
           </packing>
         </child>
         <child>
-          <object class="GtkBox" id="box1">
+          <object class="GtkFrame" id="frame2">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="border_width">10</property>
-            <property name="orientation">vertical</property>
-            <property name="spacing">5</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
             <child>
-              <object class="GtkLabel" id="label1">
+              <object class="GtkBox" id="box13">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">_Annotation 
label:</property>
-                <property name="use_underline">True</property>
-                <property name="mnemonic_widget">eSFAnnotationLabel</property>
+                <property name="margin_left">3</property>
+                <property name="margin_right">3</property>
+                <property name="margin_top">3</property>
+                <property name="margin_bottom">3</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">3</property>
+                <child>
+                  <object class="GtkRadioButton" id="eSFAnnotationTypePlain">
+                    <property name="label" translatable="yes">_Plain</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="xalign">0</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkRadioButton" id="eSFAnnotationTypeSpindle">
+                    <property name="label" 
translatable="yes">_Spindle</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="xalign">0</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">eSFAnnotationTypePlain</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkRadioButton" 
id="eSFAnnotationTypeKComplex">
+                    <property name="label" 
translatable="yes">_K-complex</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="xalign">0</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">eSFAnnotationTypePlain</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkRadioButton" id="eSFAnnotationTypeBlink">
+                    <property name="label" translatable="yes">_Eye 
blink</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="xalign">0</property>
+                    <property name="draw_indicator">True</property>
+                    <property name="group">eSFAnnotationTypePlain</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
             </child>
-            <child>
-              <object class="GtkEntry" id="eSFAnnotationLabel">
+            <child type="label">
+              <object class="GtkLabel" id="label51">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="has_focus">True</property>
-                <property name="max_length">120</property>
-                <property name="invisible_char">•</property>
-                <property name="activates_default">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" 
translatable="yes">&lt;b&gt;Type&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
             </child>
           </object>
           <packing>
             <property name="expand">False</property>
             <property name="fill">True</property>
-            <property name="position">1</property>
+            <property name="position">2</property>
           </packing>
         </child>
       </object>
@@ -2450,7 +2579,6 @@ skew:     𝑔(𝑢) = 𝑢2</property>
                 <property name="xalign">0.0099999997764825821</property>
                 <property name="label" translatable="yes">_Annotations under 
pointer:</property>
                 <property name="use_underline">True</property>
-                <property name="mnemonic_widget">eSFAnnotationLabel</property>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -2595,7 +2723,7 @@ skew:     𝑔(𝑢) = 𝑢2</property>
       <action-widget response="-1">button7</action-widget>
     </action-widgets>
   </object>
-  <object class="GtkSizeGroup" id="sizegroup1">
+  <object class="GtkSizeGroup" id="zModeContainers">
     <widgets>
       <widget name="cSFICAModeContainer"/>
       <widget name="cSFScoringModeContainer"/>
diff --git a/src/ui/sf/channel.cc b/src/ui/sf/channel.cc
index cd8eef3..7fa2631 100644
--- a/src/ui/sf/channel.cc
+++ b/src/ui/sf/channel.cc
@@ -63,6 +63,7 @@ SChannel( agh::CRecording& r,
        draw_selection_dzcdf (false),
        draw_phasic_spindle (true),
        draw_phasic_Kcomplex (true),
+       draw_phasic_eyeblink (true),
        apply_reconstituted (false),
        config_keys_b ({
                confval::SValidator<bool>( string(1, seq) + ".hidden",          
        &hidden),
@@ -77,6 +78,7 @@ SChannel( agh::CRecording& r,
                confval::SValidator<bool>( string(1, seq) + ".draw_mc",         
        &draw_mc),
                confval::SValidator<bool>( string(1, seq) + 
".draw_phasic_spindle",     &draw_phasic_spindle),
                confval::SValidator<bool>( string(1, seq) + 
".draw_phasic_Kcomplex",    &draw_phasic_Kcomplex),
+               confval::SValidator<bool>( string(1, seq) + 
".draw_phasic_eyeblink",    &draw_phasic_eyeblink),
                confval::SValidator<bool>( string(1, seq) + 
".autoscale_profile",       &autoscale_profile),
                confval::SValidator<bool>( string(1, seq) + ".resample_signal", 
        &resample_signal),
                confval::SValidator<bool>( string(1, seq) + ".resample_power",  
        &resample_power),
@@ -523,6 +525,10 @@ update_channel_menu_items( double x)
        gtk_check_menu_item_set_active( _p.iSFPageDrawMCProfile,   draw_mc);
        gtk_check_menu_item_set_active( _p.iSFPageDrawSWUProfile,  draw_swu);
 
+       gtk_check_menu_item_set_active( _p.iSFPageDrawPhasicSpindles,   
draw_phasic_spindle);
+       gtk_check_menu_item_set_active( _p.iSFPageDrawPhasicKComplexes, 
draw_phasic_Kcomplex);
+       gtk_check_menu_item_set_active( _p.iSFPageDrawPhasicEyeBlinks,  
draw_phasic_eyeblink);
+
        gtk_check_menu_item_set_active( _p.iSFPageSelectionDrawCourse,   
draw_selection_course);
        gtk_check_menu_item_set_active( _p.iSFPageSelectionDrawEnvelope, 
draw_selection_envelope);
        gtk_check_menu_item_set_active( _p.iSFPageSelectionDrawDzxdf,    
draw_selection_dzcdf);
@@ -532,7 +538,6 @@ update_channel_menu_items( double x)
                have_profile = is_eeg or is_emg;
        gtk_widget_set_visible( (GtkWidget*)_p.iSFPageProfilesSubmenuSeparator, 
have_profile);
        gtk_widget_set_visible( (GtkWidget*)_p.iiSFPageProfiles,                
have_profile);
-       gtk_widget_set_visible( (GtkWidget*)_p.iiSFPagePhasicEvents,            
have_profile);
        gtk_widget_set_visible( (GtkWidget*)_p.iSFPageDrawPSDProfile,  is_eeg);
        gtk_widget_set_visible( (GtkWidget*)_p.iSFPageDrawPSDSpectrum, is_eeg);
        gtk_widget_set_visible( (GtkWidget*)_p.iSFPageDrawSWUProfile,  is_eeg);
diff --git a/src/ui/sf/construct.cc b/src/ui/sf/construct.cc
index facb21a..0480df3 100644
--- a/src/ui/sf/construct.cc
+++ b/src/ui/sf/construct.cc
@@ -217,6 +217,9 @@ SScoringFacilityWidgets ()
             !(AGH_GBGETOBJ (GtkCheckMenuItem,          iSFPageDrawSWUProfile)) 
||
             !(AGH_GBGETOBJ (GtkCheckMenuItem,          iSFPageDrawMCProfile)) 
||
             !(AGH_GBGETOBJ (GtkCheckMenuItem,          iSFPageDrawEMGProfile)) 
||
+            !(AGH_GBGETOBJ (GtkCheckMenuItem,          
iSFPageDrawPhasicSpindles)) ||
+            !(AGH_GBGETOBJ (GtkCheckMenuItem,          
iSFPageDrawPhasicKComplexes)) ||
+            !(AGH_GBGETOBJ (GtkCheckMenuItem,          
iSFPageDrawPhasicEyeBlinks)) ||
             !(AGH_GBGETOBJ (GtkMenuItem,               iSFPageFilter)) ||
             !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageSaveChannelAsSVG)) ||
             !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageSaveMontageAsSVG)) ||
@@ -233,6 +236,9 @@ SScoringFacilityWidgets ()
             !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageAnnotationSeparator)) ||
             !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageAnnotationDelete)) ||
             !(AGH_GBGETOBJ (GtkMenuItem,               iSFPageAnnotationEdit)) 
||
+            !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageAnnotationClearAll)) ||
+            !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageAnnotationGotoNext)) ||
+            !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageAnnotationGotoPrev)) ||
 
             !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageSelectionMarkArtifact)) ||
             !(AGH_GBGETOBJ (GtkMenuItem,               
iSFPageSelectionClearArtifact)) ||
@@ -264,17 +270,18 @@ SScoringFacilityWidgets ()
 
        G_CONNECT_1 (iSFPageAnnotationDelete, activate);
        G_CONNECT_1 (iSFPageAnnotationEdit, activate);
+       G_CONNECT_1 (iSFPageAnnotationClearAll, activate);
+       G_CONNECT_1 (iSFPageAnnotationGotoPrev, activate);
+       G_CONNECT_1 (iSFPageAnnotationGotoNext, activate);
 
        G_CONNECT_1 (iSFPageSelectionMarkArtifact, activate);
        G_CONNECT_1 (iSFPageSelectionClearArtifact, activate);
        G_CONNECT_1 (iSFPageSelectionFindPattern, activate);
        G_CONNECT_1 (iSFPageSelectionAnnotate, activate);
-
        G_CONNECT_1 (iSFPageSelectionDrawCourse, toggled);
        G_CONNECT_1 (iSFPageSelectionDrawEnvelope, toggled);
        G_CONNECT_1 (iSFPageSelectionDrawDzxdf, toggled);
 
-
        G_CONNECT_1 (iSFPageFilter, activate);
        G_CONNECT_1 (iSFPageSaveChannelAsSVG, activate);
        G_CONNECT_1 (iSFPageSaveMontageAsSVG, activate);
@@ -294,6 +301,10 @@ SScoringFacilityWidgets ()
        G_CONNECT_1 (iSFPageDrawSWUProfile, toggled);
        G_CONNECT_1 (iSFPageDrawEMGProfile, toggled);
 
+       G_CONNECT_1 (iSFPageDrawPhasicSpindles, toggled);
+       G_CONNECT_1 (iSFPageDrawPhasicKComplexes, toggled);
+       G_CONNECT_1 (iSFPageDrawPhasicEyeBlinks, toggled);
+
        G_CONNECT_1 (iSFPowerExportRange, activate);
        G_CONNECT_1 (iSFPowerExportAll, activate);
        G_CONNECT_1 (iSFPowerSmooth, toggled);
@@ -308,10 +319,14 @@ SScoringFacilityWidgets ()
 
       // petty dialogs
        // annotations
-       if ( !(AGH_GBGETOBJ (GtkDialog,                 wSFAnnotationLabel)) ||
-            !(AGH_GBGETOBJ (GtkEntry,                  eSFAnnotationLabel)) ||
-            !(AGH_GBGETOBJ (GtkDialog,                 wSFAnnotationSelector)) 
||
-            !(AGH_GBGETOBJ (GtkComboBox,               
eSFAnnotationSelectorWhich)) )
+       if ( !AGH_GBGETOBJ (GtkDialog,                  wSFAnnotationLabel) ||
+            !AGH_GBGETOBJ (GtkEntry,                   eSFAnnotationLabel) ||
+            !AGH_GBGETOBJ (GtkRadioButton,             eSFAnnotationTypePlain) 
||
+            !AGH_GBGETOBJ (GtkRadioButton,             
eSFAnnotationTypeSpindle) ||
+            !AGH_GBGETOBJ (GtkRadioButton,             
eSFAnnotationTypeKComplex) ||
+            !AGH_GBGETOBJ (GtkRadioButton,             eSFAnnotationTypeBlink) 
||
+            !AGH_GBGETOBJ (GtkDialog,                  wSFAnnotationSelector) 
||
+            !AGH_GBGETOBJ (GtkComboBox,                
eSFAnnotationSelectorWhich) )
                throw runtime_error ("Failed to construct SF widgets (6)");
 
        mSFAnnotationsAtCursor = gtk_list_store_new(1, G_TYPE_STRING);
diff --git a/src/ui/sf/montage_cb.cc b/src/ui/sf/montage_cb.cc
index db20431..a5ae6eb 100644
--- a/src/ui/sf/montage_cb.cc
+++ b/src/ui/sf/montage_cb.cc
@@ -628,6 +628,36 @@ iSFPageDrawEMGProfile_toggled_cb( GtkCheckMenuItem 
*checkmenuitem, gpointer user
        gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage);
 }
 
+void
+iSFPageDrawPhasicSpindles_toggled_cb( GtkCheckMenuItem *checkmenuitem, 
gpointer userdata)
+{
+       auto& SF = *(SScoringFacility*)userdata;
+       if ( SF.suppress_redraw )
+               return;
+       SF.using_channel->draw_phasic_spindle = 
(bool)gtk_check_menu_item_get_active( checkmenuitem);
+       gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage);
+}
+
+void
+iSFPageDrawPhasicKComplexes_toggled_cb( GtkCheckMenuItem *checkmenuitem, 
gpointer userdata)
+{
+       auto& SF = *(SScoringFacility*)userdata;
+       if ( SF.suppress_redraw )
+               return;
+       SF.using_channel->draw_phasic_Kcomplex = 
(bool)gtk_check_menu_item_get_active( checkmenuitem);
+       gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage);
+}
+
+void
+iSFPageDrawPhasicEyeBlinks_toggled_cb( GtkCheckMenuItem *checkmenuitem, 
gpointer userdata)
+{
+       auto& SF = *(SScoringFacility*)userdata;
+       if ( SF.suppress_redraw )
+               return;
+       SF.using_channel->draw_phasic_eyeblink = 
(bool)gtk_check_menu_item_get_active( checkmenuitem);
+       gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage);
+}
+
 
 void
 iSFPageFilter_activate_cb( GtkMenuItem *menuitem, gpointer userdata)
@@ -827,11 +857,37 @@ iSFPageAnnotationEdit_activate_cb( GtkMenuItem *menuitem, 
gpointer userdata)
                return;
 
        gtk_entry_set_text( SF.eSFAnnotationLabel, which->label.c_str());
+       switch ( which->type ) {
+       case sigfile::SAnnotation::TType::phasic_event_spindle:
+               gtk_toggle_button_set_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeSpindle, TRUE);
+               break;
+       case sigfile::SAnnotation::TType::phasic_event_K_complex:
+               gtk_toggle_button_set_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeKComplex, TRUE);
+               break;
+       case sigfile::SAnnotation::TType::eyeblink:
+               gtk_toggle_button_set_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeBlink, TRUE);
+               break;
+       case sigfile::SAnnotation::TType::plain:
+       default:
+               gtk_toggle_button_set_active( 
(GtkToggleButton*)SF.eSFAnnotationTypePlain, TRUE);
+               break;
+       }
+
        if ( GTK_RESPONSE_OK ==
             gtk_dialog_run( SF.wSFAnnotationLabel) ) {
                const char* new_label = gtk_entry_get_text( 
SF.eSFAnnotationLabel);
+               auto new_type =
+                       gtk_toggle_button_get_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeSpindle)
+                       ? sigfile::SAnnotation::TType::phasic_event_spindle
+                       : gtk_toggle_button_get_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeKComplex)
+                       ? sigfile::SAnnotation::TType::phasic_event_K_complex
+                       : gtk_toggle_button_get_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeBlink)
+                       ? sigfile::SAnnotation::TType::eyeblink
+                       : sigfile::SAnnotation::TType::plain;
+
                if ( strlen(new_label) > 0 ) {
                        which->label = new_label;
+                       which->type = new_type;
                        SF._p.populate_mGlobalAnnotations();
                        gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage);
                }
@@ -839,6 +895,63 @@ iSFPageAnnotationEdit_activate_cb( GtkMenuItem *menuitem, 
gpointer userdata)
 }
 
 
+void
+iSFPageAnnotationClearAll_activate_cb( GtkMenuItem *menuitem, gpointer 
userdata)
+{
+       auto& SF = *(SScoringFacility*)userdata;
+
+       char* chnamee = g_markup_escape_text( SF.using_channel->name, -1);
+       if ( GTK_RESPONSE_YES
+            == pop_question( SF.wSF,
+                             "Sure you want to delete all annotations in 
channel <b>%s</b>?",
+                             chnamee) ) {
+               SF.using_channel->annotations.clear();
+
+               SF._p.populate_mGlobalAnnotations();
+               gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage);
+       }
+       g_free( chnamee);
+}
+
+
+void
+iSFPageAnnotationGotoNext_activate_cb( GtkMenuItem*, gpointer userdata)
+{
+       auto& SF = *(SScoringFacility*)userdata;
+
+       if ( SF.cur_vpage() == SF.total_vpages()-1 )
+               return;
+       size_t p = SF.cur_vpage();
+       while ( ++p < SF.total_vpages() )
+               if ( SF.page_has_annotations( p, *SF.using_channel)) {
+                       SF.sb_clear();
+                       SF.set_cur_vpage( p);
+                       return;
+               }
+       SF.sb_message( "No more annotations after this");
+}
+
+void
+iSFPageAnnotationGotoPrev_activate_cb( GtkMenuItem*, gpointer userdata)
+{
+       auto& SF = *(SScoringFacility*)userdata;
+
+       if ( SF.cur_vpage() == 0 )
+               return;
+       size_t p = SF.cur_vpage();
+       while ( --p != (size_t)-1 )
+               if ( SF.page_has_annotations( p, *SF.using_channel)) {
+                       SF.sb_clear();
+                       SF.set_cur_vpage( p);
+                       return;
+               }
+       SF.sb_message( "No more annotations before this");
+}
+
+
+
+
+
 
 void
 iSFICAPageMapIC_activate_cb( GtkRadioMenuItem* i, gpointer u)
@@ -907,14 +1020,25 @@ void
 iSFPageSelectionAnnotate_activate_cb( GtkMenuItem *menuitem, gpointer userdata)
 {
        auto& SF = *(SScoringFacility*)userdata;
+
        gtk_entry_set_text( SF.eSFAnnotationLabel, "");
+
        if ( GTK_RESPONSE_OK ==
             gtk_dialog_run( (GtkDialog*)SF.wSFAnnotationLabel) ) {
                auto new_ann = gtk_entry_get_text( SF.eSFAnnotationLabel);
                if ( strlen( new_ann) == 0 )
                        return;
 
-               SF.using_channel->mark_region_as_annotation( new_ann);
+               auto type =
+                       gtk_toggle_button_get_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeSpindle)
+                       ? sigfile::SAnnotation::TType::phasic_event_spindle
+                       : gtk_toggle_button_get_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeKComplex)
+                       ? sigfile::SAnnotation::TType::phasic_event_K_complex
+                       : gtk_toggle_button_get_active( 
(GtkToggleButton*)SF.eSFAnnotationTypeBlink)
+                       ? sigfile::SAnnotation::TType::eyeblink
+                       : sigfile::SAnnotation::TType::plain;
+
+               SF.using_channel->mark_region_as_annotation( new_ann, type);
 
                gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage);
                gtk_widget_queue_draw( (GtkWidget*)SF.daSFHypnogram);
diff --git a/src/ui/sf/sf.cc b/src/ui/sf/sf.cc
index d16d60e..13bca70 100644
--- a/src/ui/sf/sf.cc
+++ b/src/ui/sf/sf.cc
@@ -547,6 +547,23 @@ page_has_artifacts( size_t p, bool search_all) const
 }
 
 
+bool
+aghui::SScoringFacility::
+page_has_annotations( size_t p, const SChannel& H) const
+{
+       int     half_pad_samples = skirting_run_per1 * vpagesize() * 
H.samplerate();
+       int     cvpa =  p    * pagesize() * H.samplerate() - half_pad_samples,
+               cvpe = (p+1) * pagesize() * H.samplerate() + half_pad_samples;
+       for ( auto &A : H.annotations )
+               if ( agh::alg::overlap( (int)A.span.a, (int)A.span.z, cvpa, 
cvpe) )
+                       return true;
+               else if ( (int)A.span.a > cvpe )  // no more up to and on 
current page
+                       return false;
+       return false;
+}
+
+
+
 void
 aghui::SScoringFacility::
 draw_score_stats() const
diff --git a/src/ui/sf/sf.hh b/src/ui/sf/sf.hh
index eb84355..9cc4c1a 100644
--- a/src/ui/sf/sf.hh
+++ b/src/ui/sf/sf.hh
@@ -236,7 +236,8 @@ class SScoringFacility
                        draw_selection_envelope,
                        draw_selection_dzcdf,
                        draw_phasic_spindle,
-                       draw_phasic_Kcomplex;
+                       draw_phasic_Kcomplex,
+                       draw_phasic_eyeblink;
                bool    discard_marked,
                        apply_reconstituted;
 
@@ -378,6 +379,7 @@ class SScoringFacility
                        return sigfile::SPage::char2score( 
hypnogram[_cur_page]);
                }
        bool page_has_artifacts( size_t, bool check_all_channels = true) const;
+       bool page_has_annotations( size_t, const SChannel&) const;
 
       // pagesize
        size_t pagesize() const
@@ -814,6 +816,9 @@ void iSFPageDrawPSDSpectrum_toggled_cb( GtkCheckMenuItem*, 
gpointer);
 void iSFPageDrawSWUProfile_toggled_cb( GtkCheckMenuItem*, gpointer);
 void iSFPageDrawMCProfile_toggled_cb( GtkCheckMenuItem*, gpointer);
 void iSFPageDrawEMGProfile_toggled_cb( GtkCheckMenuItem*, gpointer);
+void iSFPageDrawPhasicSpindles_toggled_cb( GtkCheckMenuItem*, gpointer);
+void iSFPageDrawPhasicKComplexes_toggled_cb( GtkCheckMenuItem*, gpointer);
+void iSFPageDrawPhasicEyeBlinks_toggled_cb( GtkCheckMenuItem*, gpointer);
 
 void iSFPageSelectionDrawCourse_toggled_cb( GtkCheckMenuItem*, gpointer);
 void iSFPageSelectionDrawEnvelope_toggled_cb( GtkCheckMenuItem*, gpointer);
@@ -823,6 +828,9 @@ void iSFICAPageMapIC_activate_cb( GtkRadioMenuItem*, 
gpointer);
 
 void iSFPageAnnotationDelete_activate_cb( GtkMenuItem*, gpointer);
 void iSFPageAnnotationEdit_activate_cb( GtkMenuItem*, gpointer);
+void iSFPageAnnotationClearAll_activate_cb( GtkMenuItem*, gpointer);
+void iSFPageAnnotationGotoPrev_activate_cb( GtkMenuItem*, gpointer);
+void iSFPageAnnotationGotoNext_activate_cb( GtkMenuItem*, gpointer);
 
 void iSFPageSelectionMarkArtifact_activate_cb( GtkMenuItem*, gpointer);
 void iSFPageSelectionClearArtifact_activate_cb( GtkMenuItem*, gpointer);
diff --git a/src/ui/sf/widgets.hh b/src/ui/sf/widgets.hh
index d423499..be41d04 100644
--- a/src/ui/sf/widgets.hh
+++ b/src/ui/sf/widgets.hh
@@ -148,7 +148,10 @@ struct SScoringFacilityWidgets {
                *iSFPowerAutoscale,
                *iSFPageSelectionDrawCourse,
                *iSFPageSelectionDrawEnvelope,
-               *iSFPageSelectionDrawDzxdf;
+               *iSFPageSelectionDrawDzxdf,
+               *iSFPageDrawPhasicSpindles,
+               *iSFPageDrawPhasicKComplexes,
+               *iSFPageDrawPhasicEyeBlinks;
        GtkMenuItem
                *iSFPageFilter,
                *iSFPageSaveChannelAsSVG, *iSFPageSaveMontageAsSVG,
@@ -161,6 +164,9 @@ struct SScoringFacilityWidgets {
                *iSFPageAnnotationSeparator,
                *iSFPageAnnotationDelete,
                *iSFPageAnnotationEdit,
+               *iSFPageAnnotationClearAll,
+               *iSFPageAnnotationGotoPrev,
+               *iSFPageAnnotationGotoNext,
                *iSFPageSelectionMarkArtifact, *iSFPageSelectionClearArtifact,
                *iSFPageSelectionFindPattern,
                *iSFPageSelectionAnnotate,
@@ -179,6 +185,11 @@ struct SScoringFacilityWidgets {
                *wSFAnnotationSelector;
        GtkEntry
                *eSFAnnotationLabel;
+       GtkRadioButton
+               *eSFAnnotationTypePlain,
+               *eSFAnnotationTypeSpindle,
+               *eSFAnnotationTypeKComplex,
+               *eSFAnnotationTypeBlink;
        GtkComboBox
                *eSFAnnotationSelectorWhich;
 

-- 
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