The following commit has been merged in the master branch:
commit b180ff18ca5b5667ef68d57ee9ece79421ec6d6e
Author: Andrei Zavada <[email protected]>
Date:   Sat Jul 20 22:39:32 2013 +0300

    use some rich text in Scan Report log

diff --git a/src/aghermann/expdesign/primaries.cc 
b/src/aghermann/expdesign/primaries.cc
index 13692fb..720f91d 100644
--- a/src/aghermann/expdesign/primaries.cc
+++ b/src/aghermann/expdesign/primaries.cc
@@ -145,19 +145,34 @@ log_message( const char* fmt, ...)
        va_list ap;
        va_start (ap, fmt);
 
-       char *buf;
-       assert (vasprintf( &buf, fmt, ap) > 0);
+       char *buf0;
+       int np = vasprintf( &buf0, fmt, ap);
+       char *buf = buf0;
+       if ( np > 0 ) {
+               TLogEntryStyle style =
+                       (strncmp( buf, "$$", 2) == 0)
+                       ? ((buf += 2), TLogEntryStyle::bold)
+                       : (strncmp( buf, "//", 2) == 0)
+                       ? ((buf += 2), TLogEntryStyle::italic)
+                       : TLogEntryStyle::plain;
+               fprintf( stdout, "%s\n", buf0);
+               _error_log.emplace_back( buf, style);
+       }
+       if ( np != -1 )
+               free( (void*)buf0);
 
-       _error_log += buf;
-       if ( strlen(buf) && *(buf + strlen(buf)-1) != '\n' ) {
-               _error_log += "\n";
-               fprintf( stdout, "%s\n", buf);
-       } else
-               fputs( buf, stdout);
+       va_end (ap);
+}
 
-       free( (void*)buf);
 
-       va_end (ap);
+string
+agh::CExpDesign::
+error_log_serialize() const
+{
+       string ret;
+       for ( const auto& E : _error_log )
+               ret += E.first + '\n';
+       return ret;
 }
 
 
diff --git a/src/aghermann/expdesign/primaries.hh 
b/src/aghermann/expdesign/primaries.hh
index cafe74f..80fbf6c 100644
--- a/src/aghermann/expdesign/primaries.hh
+++ b/src/aghermann/expdesign/primaries.hh
@@ -310,18 +310,18 @@ class CExpDesign {
                        return _session_dir.substr( _session_dir.rfind( '/'));
                }
 
+      // error log
+       enum class TLogEntryStyle { plain, bold, italic };
+       const list<pair<string, TLogEntryStyle>>&
+       error_log() const
+               { return _error_log; }
        void reset_error_log()
-               {
-                       _error_log.clear();
-               }
+               { _error_log.clear(); }
        const char* last_error() const
-               {
-                       return &_error_log[_error_log.rfind("\n", 
_error_log.size()-1)];
-               }
-       const string& error_log() const
-               {
-                       return _error_log;
-               }
+               { return _error_log.back().first.c_str(); }
+       string error_log_serialize() const;
+       size_t error_log_n_messages() const
+               { return _error_log.size(); }
        void log_message( const char* fmt, ...);
 
       // contains
@@ -483,7 +483,8 @@ class CExpDesign {
 
        int     _status;
        string  _session_dir;
-       string  _error_log;
+       list<pair<string, TLogEntryStyle>>
+               _error_log;
 
        sid_t   _id_pool;
       // load/save
diff --git a/src/aghermann/expdesign/tree-scanner.cc 
b/src/aghermann/expdesign/tree-scanner.cc
index d581371..30e4f62 100644
--- a/src/aghermann/expdesign/tree-scanner.cc
+++ b/src/aghermann/expdesign/tree-scanner.cc
@@ -159,14 +159,14 @@ register_intree_source( sigfile::CTypedSource&& F,
 
                // refuse to register sources of wrong subjects
                if ( j_name != F().subject().id ) {
-                       log_message( "%s: file belongs to subject %s (\"%s\"), 
is misplaced here under subject \"%s\"\n",
+                       log_message( "%s: file belongs to subject %s (\"%s\"), 
is misplaced here under subject \"%s\"",
                                     F().filename(), F().subject().id.c_str(), 
F().subject().name.c_str(), j_name.c_str());
                        return -1;
                }
                try {
                        auto existing_group = group_of( 
F().subject().id.c_str());
                        if ( g_name != existing_group ) {
-                               log_message( "%s: subject %s (\"%s\") belongs 
to a different group (\"%s\")\n",
+                               log_message( "%s: subject %s (\"%s\") belongs 
to a different group (\"%s\")",
                                             F().filename(), 
F().subject().id.c_str(), F().subject().name.c_str(), existing_group);
                                return -1;
                        }
@@ -176,12 +176,12 @@ register_intree_source( sigfile::CTypedSource&& F,
 
                // but correct session/episode fields
                if ( d_name != F().session() ) {
-                       log_message( "%s: correcting embedded session \"%s\" to 
match placement in the tree (\"%s\")\n",
+                       log_message( "%s: correcting embedded session \"%s\" to 
match placement in the tree (\"%s\")",
                                     F().filename(), F().session(), 
d_name.c_str());
                        F().set_session( d_name.c_str());
                }
                if ( e_name != F().episode() ) {
-                       log_message( "%s: correcting embedded episode \"%s\" to 
match file name\n",
+                       log_message( "%s: correcting embedded episode \"%s\" to 
match file name",
                                     F().filename(), F().episode());
                        F().set_episode( e_name.c_str());
                }
@@ -213,11 +213,11 @@ register_intree_source( sigfile::CTypedSource&& F,
                switch ( J->measurements[F().session()].add_one(
                                 move(F), fft_params, swu_params, mc_params) ) 
{  // this will do it
                case AGH_EPSEQADD_OVERLAP:
-                       log_message( "%s: not added as it overlaps with 
existing episodes\n",
+                       log_message( "%s: not added as it overlaps with 
existing episodes",
                                     F().filename());
                        return -1;
                case AGH_EPSEQADD_TOOFAR:
-                       log_message( "%s: not added as it is too far removed 
from the rest\n",
+                       log_message( "%s: not added as it is too far removed 
from the rest",
                                     F().filename());
                        return -1;
                default:
@@ -225,12 +225,12 @@ register_intree_source( sigfile::CTypedSource&& F,
                }
 
        } catch (invalid_argument ex) {
-               log_message( ex.what() + '\n');
+               log_message( ex.what());
                if ( reason_if_failed_p )
                        *reason_if_failed_p = ex.what();
                return -1;
        } catch (int status) {
-               log_message( "Bad edf header or data\n");
+               log_message( "Bad edf header or data");
                if ( reason_if_failed_p )
                        *reason_if_failed_p = "Bad edf header or data";
                return -1;
@@ -286,13 +286,15 @@ edf_file_processor( const char *fname, const struct 
stat*, int flag, struct FTW
                                using namespace sigfile;
                                CTypedSource F {fname, 
(size_t)roundf(__expdesign->fft_params.pagesize)};
                                string st = F().explain_status();
-                               if ( not st.empty() )
-                                       __expdesign->log_message( "In 
%s:\n%s\n", fname, st.c_str());
+                               if ( not st.empty() ) {
+                                       __expdesign->log_message( "$$%s:", 
fname);
+                                       __expdesign->log_message( "%s", 
st.c_str());
+                               }
                                // we only support edf and edfplus/edf_c
                                if ( agh::CExpDesign::is_supported_source(F) )
                                        __expdesign -> register_intree_source( 
move(F));
                                else
-                                       __expdesign -> log_message( "File %s: 
unsupported format\n", fname);
+                                       __expdesign -> log_message( "File %s: 
unsupported format", fname);
 
                        } catch ( invalid_argument ex) {
                                __expdesign->log_message(ex.what());
@@ -359,7 +361,7 @@ scan_tree( TMsmtCollectProgressIndicatorFun 
user_progress_fun)
                        for ( auto &D : J.measurements )
                                if ( D.second.episodes.size() < n_episodes &&
                                     complete_episode_set.front() != 
D.second.episodes.begin()->name() ) { // the baseline is missing
-                                       log_message( "No Baseline episode in 
%s's %s: skip this session\n",
+                                       log_message( "No Baseline episode in 
%s's %s: skip this session",
                                                     J.id.c_str(), 
D.first.c_str());
                                        J.measurements.erase(D.first);
                                        goto startover;
diff --git a/src/aghermann/model/achermann.cc b/src/aghermann/model/achermann.cc
index 03eb09f..c33a40e 100644
--- a/src/aghermann/model/achermann.cc
+++ b/src/aghermann/model/achermann.cc
@@ -105,7 +105,7 @@ setup_modrun( const string& j, const string& d, const 
string& h,
                fprintf( stderr, "CExpDesign::setup_modrun( %s, %s, %s): %s\n", 
j.c_str(), d.c_str(), h.c_str(), ex.what());
                return -1;
        } catch (int ex) { // thrown by CModelRun ctor
-               log_message( "CExpDesign::setup_modrun( %s, %s, %s): %s\n", 
j.c_str(), d.c_str(), h.c_str(), CProfile::explain_status(ex).c_str());
+               log_message( "CExpDesign::setup_modrun( %s, %s, %s): %s", 
j.c_str(), d.c_str(), h.c_str(), CProfile::explain_status(ex).c_str());
                return ex;
        }
 
diff --git a/src/aghermann/ui/mw/construct.cc b/src/aghermann/ui/mw/construct.cc
index 12ac6f5..b084975 100644
--- a/src/aghermann/ui/mw/construct.cc
+++ b/src/aghermann/ui/mw/construct.cc
@@ -315,6 +315,17 @@ SExpDesignUIWidgets ()
                throw runtime_error ("Failed to construct widgets");
 
        gtk_widget_override_font( (GtkWidget*)tScanLog, font_desc);
+       gtk_text_buffer_create_tag(
+               gtk_text_view_get_buffer( tScanLog),
+               "bold",
+               "weight", PANGO_WEIGHT_BOLD,
+               NULL);
+       gtk_text_buffer_create_tag(
+               gtk_text_view_get_buffer( tScanLog),
+               "italic",
+               "style", PANGO_STYLE_ITALIC,
+               NULL);
+
        // free? unref? leak some?
 
       // ****************** settings
diff --git a/src/aghermann/ui/mw/populate.cc b/src/aghermann/ui/mw/populate.cc
index 3fdffd7..d4af478 100644
--- a/src/aghermann/ui/mw/populate.cc
+++ b/src/aghermann/ui/mw/populate.cc
@@ -127,10 +127,41 @@ populate( bool do_load)
                set_controls_for_empty_experiment( false);
        }
 
-       if ( not ED->error_log().empty() ) {
+       if ( ED->error_log_n_messages() > 0 ) {
                if ( not suppress_scan_report ) {
-                       gtk_text_buffer_set_text( gtk_text_view_get_buffer( 
tScanLog),
-                                                 ED->error_log().c_str(), -1);
+                       auto buffer = gtk_text_view_get_buffer( tScanLog);
+                       for ( const auto& L : ED->error_log() ) {
+
+                               GtkTextIter X0, X9;
+                               gtk_text_buffer_get_end_iter(
+                                       buffer, &X0);
+                               gint x0 = gtk_text_iter_get_offset( &X0);
+
+                               gtk_text_buffer_insert_at_cursor(
+                                       buffer, (L.first + '\n').c_str(), -1);
+                               gtk_text_buffer_get_iter_at_offset(
+                                       buffer, &X0, x0);
+                               gtk_text_buffer_get_end_iter(
+                                       buffer, &X9);
+                               // gtk_text_iter_backward_cursor_position(
+                               //      &X9);
+
+                               switch ( L.second ) {
+                               case agh::CExpDesign::TLogEntryStyle::bold:
+                                       gtk_text_buffer_apply_tag_by_name(
+                                               buffer, "bold",
+                                               &X0, &X9);
+                                       break;
+                               case agh::CExpDesign::TLogEntryStyle::italic:
+                                       gtk_text_buffer_apply_tag_by_name(
+                                               buffer, "italic",
+                                               &X0, &X9);
+                                       break;
+                               case agh::CExpDesign::TLogEntryStyle::plain:
+                               default:
+                                       break;
+                               }
+                       }
                        gtk_widget_show_all( (GtkWidget*)wScanLog);
                } else
                        gdk_window_beep( gtk_widget_get_window( 
(GtkWidget*)wMainWindow));

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