This is an automated email from the git hooks/post-receive script. hmmr-guest pushed a commit to branch master in repository aghermann.
commit 26b713d74fc0c53c390020ea337b94cf65b5ffbe Author: Andrei Zavada <[email protected]> Date: Fri Sep 27 02:43:44 2013 +0300 RK1968 essential WIP --- upstream/ChangeLog | 2 + upstream/data/sf-rk1968.glade | 119 +++++++++----------- upstream/src/aghermann/rk1968/rk1968.cc | 17 ++- upstream/src/aghermann/rk1968/rk1968.hh | 2 +- .../src/aghermann/ui/dirlevel-storable-adapter.ii | 26 ++++- upstream/src/aghermann/ui/sf/d/rk1968.cc | 5 + upstream/src/aghermann/ui/sf/d/rk1968.hh | 7 ++ upstream/src/aghermann/ui/sf/d/rk1968_cb.cc | 77 +++++++++++-- upstream/src/aghermann/ui/sf/sf.cc | 8 +- upstream/src/aghermann/ui/sf/sf.hh | 3 +- 10 files changed, 184 insertions(+), 82 deletions(-) diff --git a/upstream/ChangeLog b/upstream/ChangeLog index 7c364d5..1685d92 100644 --- a/upstream/ChangeLog +++ b/upstream/ChangeLog @@ -8,6 +8,8 @@ v.0.9.2 (2013-xx-xx) * Use subject ID in place of name if the latter is missing. * Properly handle various system/user/experiment/subject/session stored settings packs (patterns, rk1968, etc). + * Incorporate edfhed.glade in aghermann.gresources. + * SF: basic dialog for RK1968 scoring assistant parameters. v.0.9.1.1 (2013-07-24) * Fix 32-bit builds where sizeof(size_t) != sizeof(unsigned long). diff --git a/upstream/data/sf-rk1968.glade b/upstream/data/sf-rk1968.glade index efb42f6..e060e98 100644 --- a/upstream/data/sf-rk1968.glade +++ b/upstream/data/sf-rk1968.glade @@ -11,7 +11,7 @@ <object class="GtkDialog" id="wSFRK"> <property name="can_focus">False</property> <property name="border_width">10</property> - <property name="title" translatable="yes">Find/manage patterns</property> + <property name="title" translatable="yes">Rechtschaffen & Kales</property> <property name="destroy_with_parent">True</property> <property name="type_hint">normal</property> <property name="skip_taskbar_hint">True</property> @@ -19,7 +19,6 @@ <property name="gravity">north</property> <signal name="close" handler="gtk_widget_hide_on_delete" swapped="no"/> <signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/> - <signal name="response" handler="gtk_widget_hide_on_delete" swapped="no"/> <child internal-child="vbox"> <object class="GtkBox" id="dialog-vbox19"> <property name="visible">True</property> @@ -49,7 +48,7 @@ </child> <child> <object class="GtkToggleButton" id="bSFRKPreview"> - <property name="label" translatable="yes">Preview</property> + <property name="label" translatable="yes">Try</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> @@ -94,16 +93,12 @@ <property name="margin_top">5</property> <property name="margin_bottom">5</property> <child> - <object class="GtkLabel" id="label45"> + <object class="GtkLabel" id="lSFRKTopInfo"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="xalign">0</property> - <property name="xpad">5</property> - <property name="label" translatable="yes">Rechtschaffen & Kales</property> - <attributes> - <attribute name="weight" value="bold"/> - <attribute name="scale" value="1.1000000000000001"/> - </attributes> + <property name="label" translatable="yes">RK (n channels)</property> + <property name="use_markup">True</property> </object> <packing> <property name="expand">True</property> @@ -196,68 +191,52 @@ </packing> </child> <child> - <object class="GtkHBox" id="hbox6"> + <object class="GtkTable" id="cSFRKControls"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="margin_top">5</property> - <property name="spacing">8</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="column_spacing">5</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> <child> - <object class="GtkTable" id="cSFRKControls"> + <object class="GtkSpinButton" id="eSFRKNremThetaDeltaRatio"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="n_rows">2</property> - <property name="n_columns">2</property> - <property name="column_spacing">5</property> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <object class="GtkSpinButton" id="eSFRKNremThetaDeltaRatio"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">•</property> - <property name="xalign">1</property> - <property name="adjustment">jSFRKNremThetaDeltaRatio</property> - <property name="digits">2</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">NREM Delta/Theta power ratio:</property> - </object> - </child> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="xalign">1</property> + <property name="adjustment">jSFRKNremThetaDeltaRatio</property> + <property name="digits">2</property> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="padding">2</property> - <property name="position">0</property> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> </packing> </child> <child> - <placeholder/> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">NREM Delta/Theta power ratio:</property> + </object> </child> </object> <packing> @@ -266,6 +245,18 @@ <property name="position">2</property> </packing> </child> + <child> + <object class="GtkLabel" id="lSFRKBottomInfo"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</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">True</property> @@ -283,7 +274,7 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> </object> diff --git a/upstream/src/aghermann/rk1968/rk1968.cc b/upstream/src/aghermann/rk1968/rk1968.cc index 26e49d3..b3a9ef8 100644 --- a/upstream/src/aghermann/rk1968/rk1968.cc +++ b/upstream/src/aghermann/rk1968/rk1968.cc @@ -42,12 +42,16 @@ CScoreAssistant (const string& name_, int CScoreAssistant:: -score( agh::SEpisode& E) +score( agh::SEpisode& E, size_t* n_pages_scored_p) { + size_t n_pages_scored = 0; + forward_list<agh::CRecording*> HH; for ( auto &R : E.recordings ) if ( R.second.psd_profile.have_data() ) HH.push_front( &R.second); + if ( HH.empty() ) + return -1; forward_list<valarray<TFloat>> courses_delta, @@ -68,12 +72,19 @@ score( agh::SEpisode& E) auto Di = courses_delta.begin(), Ti = courses_theta.begin(); int decision = 0; - for ( ; Di != courses_delta.end(); ++Di, ++Ti ) + for ( ; Di != courses_delta.end(); ++Di, ++Ti ) { decision += ( (*Di)[p] > (*Ti)[p] * Pp.nrem3_delta_theta_ratio ); - if ( decision > 0 ) + } + if ( decision > 0 ) { firstsource[p].mark( sigfile::SPage::TScore::nrem3); + ++n_pages_scored; + } } + + if ( n_pages_scored_p ) + *n_pages_scored_p = n_pages_scored; + return 0; } diff --git a/upstream/src/aghermann/rk1968/rk1968.hh b/upstream/src/aghermann/rk1968/rk1968.hh index 69a34e7..9de6fc8 100644 --- a/upstream/src/aghermann/rk1968/rk1968.hh +++ b/upstream/src/aghermann/rk1968/rk1968.hh @@ -83,7 +83,7 @@ class CScoreAssistant return Pp == rv.Pp; } - int score( agh::SEpisode&); + int score( agh::SEpisode&, size_t* pages_scored_successfuly); SScoreAssistantPPack Pp; diff --git a/upstream/src/aghermann/ui/dirlevel-storable-adapter.ii b/upstream/src/aghermann/ui/dirlevel-storable-adapter.ii index f7d1f47..44654c4 100644 --- a/upstream/src/aghermann/ui/dirlevel-storable-adapter.ii +++ b/upstream/src/aghermann/ui/dirlevel-storable-adapter.ii @@ -198,6 +198,28 @@ bXProfileSave_clicked_cb() { g_signal_emit_by_name( eXProfileSaveName, "changed"); + gtk_entry_set_text( + eXProfileSaveName, + (current_profile->level != agh::TExpDirLevel::transient) + ? current_profile->name.c_str() + : ""); + + switch ( current_profile->level ) { + //case agh::TExpDirLevel::session: + case agh::TExpDirLevel::subject: + gtk_toggle_button_set_active( (GtkToggleButton*)eXProfileSaveOriginSubject, TRUE); + break; + //case agh::TExpDirLevel::group: + case agh::TExpDirLevel::experiment: + gtk_toggle_button_set_active( (GtkToggleButton*)eXProfileSaveOriginExperiment, TRUE); + break; + case agh::TExpDirLevel::user: + gtk_toggle_button_set_active( (GtkToggleButton*)eXProfileSaveOriginUser, TRUE); + break; + default: + break; + } + if ( GTK_RESPONSE_OK == gtk_dialog_run( wXProfileSaveName) ) { using namespace agh; @@ -293,8 +315,10 @@ bXProfileDiscard_clicked_cb() if ( not profiles.empty() ) { Pp2 = *current_profile; - atomic_up(); + } else { + profiles.emplace_back( Pp2); + profiles.back().level = TExpDirLevel::transient; } populate_combo(); diff --git a/upstream/src/aghermann/ui/sf/d/rk1968.cc b/upstream/src/aghermann/ui/sf/d/rk1968.cc index b1fa1b9..30846cf 100644 --- a/upstream/src/aghermann/ui/sf/d/rk1968.cc +++ b/upstream/src/aghermann/ui/sf/d/rk1968.cc @@ -33,6 +33,7 @@ SRK1968Dialog (SScoringFacility& p_) wSFRKProfileSave, eSFRKProfileSaveName, eSFRKProfileSaveOriginSubject, eSFRKProfileSaveOriginExperiment, eSFRKProfileSaveOriginUser, bSFRKProfileSaveOK), + suppress_preview_handler (false), _p (p_) { // 1. widgets @@ -47,8 +48,11 @@ SRK1968Dialog (SScoringFacility& p_) AGH_GBGETOBJ (bSFRKProfileDiscard); AGH_GBGETOBJ (eSFRKProfileList); AGH_GBGETOBJ (eSFRKNremThetaDeltaRatio); + AGH_GBGETOBJ (lSFRKTopInfo); + AGH_GBGETOBJ (lSFRKBottomInfo); AGH_GBGETOBJ (bSFRKPreview); AGH_GBGETOBJ (bSFRKApply); + AGH_GBGETOBJ (bSFRKDismiss); AGH_GBGETOBJ (wSFRKProfileSave); AGH_GBGETOBJ (eSFRKProfileSaveName); AGH_GBGETOBJ (eSFRKProfileSaveOriginSubject); @@ -79,6 +83,7 @@ SRK1968Dialog (SScoringFacility& p_) G_CONNECT_1 (bSFRKPreview, toggled); G_CONNECT_1 (bSFRKApply, clicked); + G_CONNECT_1 (bSFRKDismiss, clicked); G_CONNECT_1 (eSFRKProfileSaveName, changed); diff --git a/upstream/src/aghermann/ui/sf/d/rk1968.hh b/upstream/src/aghermann/ui/sf/d/rk1968.hh index f0e54c3..cf64dc6 100644 --- a/upstream/src/aghermann/ui/sf/d/rk1968.hh +++ b/upstream/src/aghermann/ui/sf/d/rk1968.hh @@ -39,6 +39,8 @@ struct SScoringFacility::SRK1968Dialog vector<sigfile::SPage> backup; + bool suppress_preview_handler; + // parent SScoringFacility& _p; @@ -66,8 +68,12 @@ struct SScoringFacility::SRK1968Dialog GtkToggleButton *bSFRKPreview; GtkButton + *bSFRKDismiss, *bSFRKApply; + GtkLabel + *lSFRKTopInfo, + *lSFRKBottomInfo; GtkDialog *wSFRKProfileSave; GtkEntry @@ -98,6 +104,7 @@ void eSFRK_any_profile_value_changed_cb( GtkSpinButton*, gpointer); void bSFRKPreview_toggled_cb( GtkToggleButton*, gpointer); void bSFRKApply_clicked_cb( GtkButton*, gpointer); +void bSFRKDismiss_clicked_cb( GtkButton*, gpointer); void eSFRK_any_profile_origin_toggled_cb(GtkRadioButton*, gpointer); void eSFRKProfileSaveName_changed_cb(GtkEditable*, gpointer); diff --git a/upstream/src/aghermann/ui/sf/d/rk1968_cb.cc b/upstream/src/aghermann/ui/sf/d/rk1968_cb.cc index 5351724..9fc8fc0 100644 --- a/upstream/src/aghermann/ui/sf/d/rk1968_cb.cc +++ b/upstream/src/aghermann/ui/sf/d/rk1968_cb.cc @@ -35,16 +35,44 @@ wSFRK_show_cb( { auto& RK = *(SScoringFacility::SRK1968Dialog*)userdata; auto& SF = RK._p; + SF.rk1968_dialog_shown = true; + // 1. profiles RK.load_profiles(); if ( RK.profiles.empty() ) RK.profiles.emplace_back( *SF._p.ED, agh::SExpDirLevelId {SF._p.ED->group_of(SF.csubject()), SF.csubject().id, SF.session()}); + RK.current_profile = RK.profiles.begin(); RK.populate_combo(); RK.set_profile_manage_buttons_visibility(); + + // 2. service backup + RK.backup.resize(SF.sepisode().sources.front().n_pages()); + RK.backup = SF.sepisode().sources.front().pages(); + + // 3. info + size_t n_available_channels = 0; + for ( auto &R : SF.sepisode().recordings ) + if ( R.second.psd_profile.have_data() ) + ++n_available_channels; + gtk_label_set_markup( + RK.lSFRKTopInfo, + snprintf_buf( + "<b>RK1968</b> (%zu EEG channel%s)", + n_available_channels, (n_available_channels == 1) ? "" : "s")); + gtk_label_set_markup( + RK.lSFRKBottomInfo, + ""); + + // 4. set up try/apply buttons + RK.suppress_preview_handler = true; + gtk_toggle_button_set_active( RK.bSFRKPreview, FALSE); + RK.suppress_preview_handler = false; + + gtk_widget_set_sensitive( (GtkWidget*)RK.bSFRKApply, FALSE); } void @@ -53,6 +81,8 @@ wSFRK_hide_cb( gpointer userdata) { auto& RK = *(SScoringFacility::SRK1968Dialog*)userdata; + auto& SF = RK._p; + SF.rk1968_dialog_shown = false; RK.save_profiles(); } @@ -74,30 +104,37 @@ bSFRKPreview_toggled_cb( { auto& RK = *(SScoringFacility::SRK1968Dialog*)userdata; auto& SF = RK._p; + if ( RK.suppress_preview_handler ) + return; if ( gtk_toggle_button_get_active(button) ) { SBusyBlock bb (RK.wSFRK); - RK.backup = SF.sepisode().sources.front().pages(); - RK.W_V.down(); - RK.Pp2.score( SF.sepisode()); + size_t pages_scored_successfuly; + if ( 0 == RK.Pp2.score( SF.sepisode(), &pages_scored_successfuly) ) + gtk_label_set_markup( + RK.lSFRKBottomInfo, + snprintf_buf( + "<small>Scored %zu page%s</small>", pages_scored_successfuly, (pages_scored_successfuly == 1) ? "" : "s")); + else + gtk_label_set_markup( + RK.lSFRKBottomInfo, "Hm. Something is wrong."); + + SF.get_hypnogram(); gtk_widget_set_sensitive( (GtkWidget*)RK.bSFRKApply, TRUE); } else { SF.sepisode().sources.front().pages() = RK.backup; + SF.get_hypnogram(); + gtk_widget_set_sensitive( (GtkWidget*)RK.bSFRKApply, FALSE); } - // gtk_label_set_markup( - // AD.lSFADDirtyPercent, - // snprintf_buf( "%4.2f%% marked", AD.using_channel->calculate_dirty_percent() * 100)); - gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage); gtk_widget_queue_draw( (GtkWidget*)SF.daSFHypnogram); - } void @@ -105,7 +142,29 @@ bSFRKApply_clicked_cb( GtkButton*, gpointer userdata) { - + auto& RK = *(SScoringFacility::SRK1968Dialog*)userdata; + + gtk_widget_hide( (GtkWidget*)RK.wSFRK); +} + +void +bSFRKDismiss_clicked_cb( + GtkButton*, + const gpointer userdata) +{ + auto& RK = *(SScoringFacility::SRK1968Dialog*)userdata; + auto& SF = RK._p; + + gtk_widget_hide( (GtkWidget*)RK.wSFRK); + + if ( TRUE == gtk_toggle_button_get_active(RK.bSFRKPreview) ) { + SF.sepisode().sources.front().pages() = RK.backup; + + SF.get_hypnogram(); + + gtk_widget_queue_draw( (GtkWidget*)SF.daSFMontage); + gtk_widget_queue_draw( (GtkWidget*)SF.daSFHypnogram); + } } diff --git a/upstream/src/aghermann/ui/sf/sf.cc b/upstream/src/aghermann/ui/sf/sf.cc index ef7d878..f2ce60d 100644 --- a/upstream/src/aghermann/ui/sf/sf.cc +++ b/upstream/src/aghermann/ui/sf/sf.cc @@ -68,6 +68,7 @@ SScoringFacility (agh::CSubject& J, _sepisode (J.measurements.at(D)[E]), hypnogram_button_down (false), artifacts_dialog_shown (false), + rk1968_dialog_shown (false), mode (TMode::scoring), crosshair_at (10), show_cur_pos_time_relative (false), @@ -309,9 +310,6 @@ SScoringFacility (agh::CSubject& J, SScoringFacility:: ~SScoringFacility () { - // put scores - put_hypnogram(); - // save montage save_montage(); @@ -572,6 +570,8 @@ SScoringFacility:: do_score_forward( const char score_ch) { hypnogram[_cur_page] = score_ch; + put_hypnogram(); + calculate_scored_percent(); draw_score_stats(); set_cur_vpage( _cur_page+1); @@ -582,6 +582,8 @@ SScoringFacility:: do_score_back( const char score_ch) { hypnogram[_cur_page] = score_ch; + put_hypnogram(); + calculate_scored_percent(); draw_score_stats(); set_cur_vpage( _cur_page-1); diff --git a/upstream/src/aghermann/ui/sf/sf.hh b/upstream/src/aghermann/ui/sf/sf.hh index 2623262..152744c 100644 --- a/upstream/src/aghermann/ui/sf/sf.hh +++ b/upstream/src/aghermann/ui/sf/sf.hh @@ -121,7 +121,8 @@ class SScoringFacility // volatile bool suppress_redraw:1, hypnogram_button_down:1, - artifacts_dialog_shown:1; + artifacts_dialog_shown:1, + rk1968_dialog_shown:1; enum class TMode { scoring, marking, -- Alioth's /git/debian-med/git-commit-notice on /srv/git.debian.org/git/debian-med/aghermann.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
