Hi,

after some talking via IRC I decided to show the actual number of lines
configured with the slider next to the slider. To make things easier for
you to check, I created a new patch (which still applies fine to the
latest CVS version) AND I made a screenshot how it looks like. It is
available at http://www.rot13.de/~majestyk/wesnoth-mp-prefs.png .

Now I need a developer willing to review the code, so that the changes
get merged into the CVS. Is there a volunteer? :-)

Cheers,
        majestyk

Andreas Grosse <[EMAIL PROTECTED]> [22:04:05 11:16] wrote:
> Hi,
> 
> I recently joined the wesnoth community, and I have a few ideas about 
> what could be improved in some parts. Instead of buggering you with
> implementing my features, I tried to do so myself. Since I am not a
> seasoned C++ programmer, I'd really appreciate if someone could review
> my attached patches. If there is a consensus about the integration, I'd
> be happy if these changes could be merged for the next version.
> 
> The things I wanted to improve are focused on multiplayer chat. On my
> first online match, things went really slow, so I wasn't always at my
> machine. Returning to it, I would have been happy to have the messages
> timestamped, to be able to trackback when something happened. Second,
> when playing on a small resolution 6 lines of chat messages are just too
> much, and I thought making it configurable would be nice.
> 
> Summary of changes:
> - created a new preferences tab, called "Multiplayer"
> - created a button called "Chat Timestamping", prepending the chat lines
>   with a "H:m:s" timestamp (e.g.:   21:42:23 <majestyk> test line )
> - created a slider called "Chat Lines", changing the amount of displayed
>   lines from 1 to 20 lines.
> 
> To work 100%, a new image is needed for the multiplayer tab. For test
> purposes, I used the silver mage because I like the image :-)
> # cp images/silver-mage.png images/icons/multiplayer.png
> 
> I'd be grateful for almost every kind of feedback :)
> 
> Cheers,
>       majestyk
Index: display.cpp
===================================================================
RCS file: /cvsroot/wesnoth/wesnoth/src/display.cpp,v
retrieving revision 1.318
diff -a -u -r1.318 display.cpp
--- display.cpp 22 Apr 2005 19:19:21 -0000      1.318
+++ display.cpp 28 Apr 2005 15:50:38 -0000
@@ -2149,6 +2149,30 @@
        grid_ = grid;
 }
 
+// timestring() returns the current date as a string.
+// Example:  20:42:18
+char *timestring ( void )
+{
+# define TIME_SIZE 40
+
+  const struct tm *tm;
+  size_t len;
+  time_t now;
+  char *s;
+
+  now = time ( NULL );
+  tm = localtime ( &now );
+
+  s = new char[TIME_SIZE];
+
+  // alternative mode, including the day ...
+  // len = strftime ( s, TIME_SIZE, "%Y-%m-%d %H:%M:%S", tm );
+  len = strftime ( s, TIME_SIZE, "%H:%M:%S", tm );
+
+  return s;
+# undef TIME_SIZE
+}
+
 void display::debug_highlight(const gamemap::location& loc, fixed_t amount)
 {
        wassert(game_config::debug);
@@ -2261,7 +2285,6 @@
 }
 
 namespace {
-       const unsigned int max_chat_messages = 6;
        const int chat_message_border = 5;
        const int chat_message_x = 10;
        const int chat_message_y = 10;
@@ -2280,6 +2303,7 @@
                msg = message;
                action = false;
        }
+
        msg = font::word_wrap_text(msg,font::SIZE_SMALL,mapx()*3/4);
 
        int ypos = chat_message_x;
@@ -2315,9 +2339,15 @@
                }
        }
 
+    // prepend message with timestamp
+    std::stringstream message_meta;
+    if (preferences::chat_timestamp()) {
+        message_meta << timestring() << " ";
+    }
+    message_meta << str.str();
 
        const SDL_Rect rect = map_area();
-       const int speaker_handle = 
font::add_floating_label(str.str(),font::SIZE_SMALL,speaker_colour,
+       const int speaker_handle = 
font::add_floating_label(message_meta.str(),font::SIZE_SMALL,speaker_colour,
                rect.x+chat_message_x,rect.y+ypos,
                
0,0,-1,rect,font::LEFT_ALIGN,&chat_message_bg,chat_message_border);
 
@@ -2338,6 +2368,8 @@
 void display::prune_chat_messages(bool remove_all)
 {
        const unsigned int message_ttl = remove_all ? 0 : 1200000;
+       const unsigned int max_chat_messages = preferences::chat_lines();
+
        if(chat_messages_.empty() == false && 
(chat_messages_.front().created_at+message_ttl < SDL_GetTicks() || 
chat_messages_.size() > max_chat_messages)) {
                const int movement = 
font::get_floating_label_rect(chat_messages_.front().handle).h;
 
Index: preferences.cpp
===================================================================
RCS file: /cvsroot/wesnoth/wesnoth/src/preferences.cpp,v
retrieving revision 1.152
diff -a -u -r1.152 preferences.cpp
--- preferences.cpp     16 Apr 2005 19:35:32 -0000      1.152
+++ preferences.cpp     28 Apr 2005 15:50:39 -0000
@@ -295,6 +295,8 @@
        return prefs["adjust_gamma"] == "yes";
 }
 
+
+
 void set_adjust_gamma(bool val)
 {
        //if we are turning gamma adjustment off, then set it to '1.0'
@@ -737,6 +739,34 @@
        prefs["flip_time"] = value ? "yes" : "no";
 }
 
+bool chat_timestamp()
+{
+       return prefs["chat_timestamp"] == "yes";
+}
+
+void set_chat_timestamp(bool value)
+{
+       prefs["chat_timestamp"] = value ? "yes" : "no";
+}
+
+int chat_lines()
+{
+       // defaults to 6 chat log lines displayed
+       static const int default_value = 6;
+       const string_map::const_iterator lines = 
prefs.values.find("chat_lines");
+       if(lines != prefs.values.end() && lines->second.empty() == false)
+               return atoi(lines->second.c_str());
+       else
+               return default_value;
+}
+
+void set_chat_lines(int lines)
+{
+       std::stringstream stream;
+       stream << lines;
+       prefs["chat_lines"] = stream.str();
+}
+
 bool show_fps()
 {
        return fps;
@@ -810,16 +840,17 @@
        void set_selection(int index);
        void update_location(SDL_Rect const &rect);
 
-       gui::slider music_slider_, sound_slider_, scroll_slider_, gamma_slider_;
+       gui::slider music_slider_, sound_slider_, scroll_slider_, 
gamma_slider_, 
+                    chat_lines_slider_;
        gui::button fullscreen_button_, turbo_button_, show_ai_moves_button_,
                    show_grid_button_, show_floating_labels_button_, 
turn_dialog_button_,
                    turn_bell_button_, show_team_colours_button_, 
show_colour_cursors_button_,
                    show_haloing_button_, video_mode_button_, hotkeys_button_, 
gamma_button_,
-                               flip_time_button_;
-       gui::label music_label_, sound_label_, scroll_label_, gamma_label_;
+                   flip_time_button_, chat_timestamp_button_;
+       gui::label music_label_, sound_label_, scroll_label_, gamma_label_, 
chat_lines_label_;
        unsigned slider_label_width_;
 
-       enum TAB { GENERAL_TAB, DISPLAY_TAB, SOUND_TAB };
+       enum TAB { GENERAL_TAB, DISPLAY_TAB, SOUND_TAB, MULTIPLAYER_TAB };
        TAB tab_;
        display &disp_;
 };
@@ -828,6 +859,7 @@
        : gui::preview_pane(disp.video()),
          music_slider_(disp.video()), sound_slider_(disp.video()),
          scroll_slider_(disp.video()), gamma_slider_(disp.video()),
+         chat_lines_slider_(disp.video()),
          fullscreen_button_(disp.video(), _("Toggle Full Screen"), 
gui::button::TYPE_CHECK),
          turbo_button_(disp.video(), _("Accelerated Speed"), 
gui::button::TYPE_CHECK),
          show_ai_moves_button_(disp.video(), _("Skip AI Moves"), 
gui::button::TYPE_CHECK),
@@ -842,8 +874,10 @@
          hotkeys_button_(disp.video(), _("Hotkeys")),
          gamma_button_(disp.video(), _("Adjust Gamma"), 
gui::button::TYPE_CHECK),
          flip_time_button_(disp.video(), _("Reverse Time Graphics"), 
gui::button::TYPE_CHECK),
+         chat_timestamp_button_(disp.video(), _("Chat Timestamping"), 
gui::button::TYPE_CHECK),
          music_label_(disp.video(), _("Music Volume:")), 
sound_label_(disp.video(), _("SFX Volume:")),
          scroll_label_(disp.video(), _("Scroll Speed:")), 
gamma_label_(disp.video(), _("Gamma:")),
+         chat_lines_label_(disp.video(), ""),
          slider_label_width_(0), tab_(GENERAL_TAB), disp_(disp)
 {
        // FIXME: this box should be vertically centered on the screen, but is 
not
@@ -855,8 +889,9 @@
 
        slider_label_width_ = maximum<unsigned>(music_label_.width(),
                              maximum<unsigned>(sound_label_.width(),
+                             maximum<unsigned>(chat_lines_label_.width(),
                              maximum<unsigned>(scroll_label_.width(),
-                                               gamma_label_.width())));
+                                               gamma_label_.width() ))));
 
        sound_slider_.set_min(1);
        sound_slider_.set_max(100);
@@ -880,6 +915,14 @@
        gamma_slider_.set_max(200);
        gamma_slider_.set_value(gamma());
        gamma_slider_.set_help_string(_("Change the brightness of the 
display"));
+       
+       chat_lines_slider_.set_min(1);
+       chat_lines_slider_.set_max(20);
+       chat_lines_slider_.set_value(chat_lines());
+       chat_lines_slider_.set_help_string(_("Set the amount of chat lines 
shown"));
+
+       chat_timestamp_button_.set_check(chat_timestamp());
+       chat_timestamp_button_.set_help_string(_("Add a timestamp to chat 
messages"));
 
        fullscreen_button_.set_check(fullscreen());
        fullscreen_button_.set_help_string(_("Choose whether the game should 
run full screen or in a window"));
@@ -971,6 +1014,14 @@
                                rect.w - slider_label_width_ - border, 0 };
        sound_slider_.set_location(sound_rect);
 
+       // Multiplayer tab
+       ypos = rect.y;
+       chat_lines_label_.set_location(rect.x, ypos);
+       SDL_Rect chat_lines_rect = { rect.x + slider_label_width_, ypos,
+                                    rect.w - slider_label_width_ - border, 0 };
+       chat_lines_slider_.set_location(chat_lines_rect);
+       ypos += item_interline; chat_timestamp_button_.set_location(rect.x, 
ypos);
+       
        set_selection(tab_);
 }
 
@@ -1010,10 +1061,20 @@
        }
        if (flip_time_button_.pressed())
                set_flip_time(flip_time_button_.checked());
+       if (chat_timestamp_button_.pressed())
+               set_chat_timestamp(chat_timestamp_button_.checked());
+
        set_sound_volume(sound_slider_.value());
        set_music_volume(music_slider_.value());
        set_scroll_speed(scroll_slider_.value());
        set_gamma(gamma_slider_.value());
+
+       set_chat_lines(chat_lines_slider_.value());
+       // display currently select amount of chat lines
+       std::stringstream buf;
+       buf << _("Chat Lines: ") << chat_lines_slider_.value();
+       chat_lines_label_.set_text(buf.str());
+       
 }
 
 void preferences_dialog::set_selection(int index)
@@ -1049,6 +1110,11 @@
        music_slider_.hide(hide_sound);
        sound_label_.hide(hide_sound);
        sound_slider_.hide(hide_sound);
+
+       bool hide_multiplayer = tab_ != MULTIPLAYER_TAB;
+       chat_lines_label_.hide(hide_multiplayer);
+       chat_lines_slider_.hide(hide_multiplayer);
+       chat_timestamp_button_.hide(hide_multiplayer);
 }
 
 }
@@ -1062,6 +1128,7 @@
        items.push_back(pre + "general.png" + sep + 
dsgettext(GETTEXT_DOMAIN,"Prefs section^General"));
        items.push_back(pre + "display.png" + sep + 
dsgettext(GETTEXT_DOMAIN,"Prefs section^Display"));
        items.push_back(pre + "music.png" + sep + 
dsgettext(GETTEXT_DOMAIN,"Prefs section^Sound"));
+       items.push_back(pre + "multiplayer.png" + sep + 
dsgettext(GETTEXT_DOMAIN,"Prefs section^Multiplayer"));
        
        for(;;) {
                try {
Index: preferences.hpp
===================================================================
RCS file: /cvsroot/wesnoth/wesnoth/src/preferences.hpp,v
retrieving revision 1.53
diff -a -u -r1.53 preferences.hpp
--- preferences.hpp     2 Apr 2005 21:33:21 -0000       1.53
+++ preferences.hpp     28 Apr 2005 15:50:39 -0000
@@ -155,6 +155,13 @@
        bool flip_time();
        void set_flip_time(bool value);
 
+       // Multiplayer functions
+       bool chat_timestamp();
+       void set_chat_timestamp(bool value);
+
+       int chat_lines();
+       void set_chat_lines(int lines);
+
        bool compress_saves();
 
        std::set<std::string> &encountered_units();

Reply via email to