[Aptitude-svn-commit] r3548 - in branches/aptitude-0.3/aptitude: . src/vscreen

Daniel Burrows dburrows@costa.debian.org
Sat, 02 Jul 2005 16:10:55 +0000


Author: dburrows
Date: Sat Jul  2 16:10:52 2005
New Revision: 3548

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.h
Log:
Allow wide strings in the multiplex tabs.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Sat Jul  2 16:10:52 2005
@@ -1,5 +1,9 @@
 2005-07-02  Daniel Burrows  <dburrows@debian.org>
 
+	* src/vscreen/vs_multiplex.cc, src/vscreen/vs_multiplex.h:
+
+	  Update the display of the multiplex's tabs for wide characters.
+
 	* src/pkg_grouppolicy.cc, src/pkg_grouppolicy.h:
 
 	  Update pkg_grouppolicy for wide characters.

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.cc	Sat Jul  2 16:10:52 2005
@@ -134,31 +134,36 @@
 	    else
 	      apply_style(tab_style);
 
-	    unsigned int thisw=remaining_w/visible_children;
+	    int thisw=remaining_w/visible_children;
 	    --visible_children;
 	    remaining_w-=thisw;
 
-	    if(i->title.size()>thisw)
-	      addnstr(i->title.c_str(), thisw);
-	    else
+	    const wstring &title = i->title;
+	    int titlew = wcswidth(title.c_str(), title.size());
+	    unsigned int leftpadding = (titlew<=thisw) ? (thisw-titlew)/2 : 0;
+
+	    while(leftpadding>0)
 	      {
-		unsigned int j=0;
-		unsigned int firstchar=(thisw-i->title.size())/2;
+		add_wch(L' ');
+		int chw=wcwidth(L' ');
+
+		leftpadding-=chw;
+		thisw-=chw;
+	      }
 
-		while(j<firstchar)
-		  {
-		    addch(' ');
-		    ++j;
-		  }
-
-		addnstr(i->title.c_str(), i->title.size());
-		j+=i->title.size();
-
-		while(j<thisw)
-		  {
-		    addch(' ');
-		    ++j;
-		  }
+	    size_t loc=0;
+	    while(thisw>0 && loc<title.size())
+	      {
+		wchar_t ch=title[loc];
+		add_wch(ch);
+		thisw-=wcwidth(ch);
+		++loc;
+	      }
+
+	    while(thisw>0)
+	      {
+		add_wch(L' ');
+		thisw-=wcwidth(L' ');
 	      }
 	  }
       assert(visible_children == 0);
@@ -351,7 +356,7 @@
 }
 
 void vs_multiplex::add_widget(vscreen_widget *w,
-			      const string &title)
+			      const wstring &title)
 {
   w->shown_sig.connect(sigc::bind(sigc::mem_fun(*this, &vs_multiplex::show_widget), w));
   w->hidden_sig.connect(sigc::bind(sigc::mem_fun(*this, &vs_multiplex::hide_widget), w));
@@ -365,10 +370,10 @@
 
 void vs_multiplex::add_widget(vscreen_widget *w)
 {
-  add_widget(w, "Untitled");
+  add_widget(w, L"Untitled");
 }
 
-void vs_multiplex::add_widget_after(vscreen_widget *w, vscreen_widget *after, const string &title)
+void vs_multiplex::add_widget_after(vscreen_widget *w, vscreen_widget *after, const wstring &title)
 {
   for(list<child_info>::iterator i=children.begin();
       i!=children.end();
@@ -397,7 +402,7 @@
 
 void vs_multiplex::add_widget_after(vscreen_widget *w, vscreen_widget *after)
 {
-  add_widget_after(w, after, "Untitled");
+  add_widget_after(w, after, L"Untitled");
 }
 
 void vs_multiplex::cycle_forward()

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.h	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_multiplex.h	Sat Jul  2 16:10:52 2005
@@ -44,9 +44,9 @@
   struct child_info
   {
     vscreen_widget *w;
-    std::string title;
+    std::wstring title;
 
-    child_info(vscreen_widget *_w, const std::string &_title)
+    child_info(vscreen_widget *_w, const std::wstring &_title)
       :w(_w), title(_title)
     {
     }
@@ -104,9 +104,9 @@
    *  deprecated.
    */
   void add_widget(vscreen_widget *widget);
-  void add_widget(vscreen_widget *widget, const std::string &title);
+  void add_widget(vscreen_widget *widget, const std::wstring &title);
   void add_widget_after(vscreen_widget *widget, vscreen_widget *after);
-  void add_widget_after(vscreen_widget *widget, vscreen_widget *after, const std::string &title);
+  void add_widget_after(vscreen_widget *widget, vscreen_widget *after, const std::wstring &title);
   void rem_widget(vscreen_widget *widget);
 
   // These cycle forward and backwards through the list of visible items.