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

Daniel Burrows dburrows@costa.debian.org
Wed, 29 Jun 2005 18:47:59 +0000


Author: dburrows
Date: Wed Jun 29 18:47:56 2005
New Revision: 3511

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/TODO
   branches/aptitude-0.3/aptitude/src/vscreen/testvscreen.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.cc
   branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.h
Log:
Convert vs_menubar to handle wide characters.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Wed Jun 29 18:47:56 2005
@@ -1,5 +1,9 @@
 2005-06-29  Daniel Burrows  <dburrows@debian.org>
 
+	* src/vscreen/vs_menubar.cc, src/vscreen/vs_menubar.h, src/vscreen/testvscreen.cc:
+
+	  Convert vs_menubar to handle wide characters.
+
 	* src/vscreen/vscreen.cc:
 
 	  Use A_REVERSE on HighlightedMenuEntry -- this gives a more

Modified: branches/aptitude-0.3/aptitude/TODO
==============================================================================
--- branches/aptitude-0.3/aptitude/TODO	(original)
+++ branches/aptitude-0.3/aptitude/TODO	Wed Jun 29 18:47:56 2005
@@ -12,7 +12,6 @@
 
     * ACS -> WACS
     * vs_statuschoice
-    * vs_menubar
     * all of src/
 
    - Display layout loose ends:

Modified: branches/aptitude-0.3/aptitude/src/vscreen/testvscreen.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/testvscreen.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/testvscreen.cc	Wed Jun 29 18:47:56 2005
@@ -408,17 +408,17 @@
   vs_label *menu_display=new vs_label("", get_style("Status"));
 
   vs_menu *menu=new vs_menu(0, 0, 0, test_file_menu);
-  menubar->append_item("File", menu);
+  menubar->append_item(L"File", menu);
   menu->item_highlighted.connect(sigc::bind(sigc::ptr_fun(&update_menu_status),
 					    menu_display));
 
   menu=new vs_menu(0, 0, 0, test_test_menu);
-  menubar->append_item("Test", menu);
+  menubar->append_item(L"Test", menu);
   menu->item_highlighted.connect(sigc::bind(sigc::ptr_fun(&update_menu_status),
 					    menu_display));
 
   menu=new vs_menu(0, 0, 0, test_help_menu);
-  menubar->append_item("Help", menu);
+  menubar->append_item(L"Help", menu);
   menu->item_highlighted.connect(sigc::bind(sigc::ptr_fun(&update_menu_status),
 					    menu_display));
 

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.cc	Wed Jun 29 18:47:56 2005
@@ -92,13 +92,16 @@
 {
   int rval=0;
   for(int i=0; i<idx; i++)
-    rval+=items[i].title.size();
+    {
+      const wstring &title=items[i].title;
+      rval+=wcswidth(title.c_str(), title.size());
+    }
   return rval;
 }
 
-void vs_menubar::append_item(string title, vs_menu *menu)
+void vs_menubar::append_item(wstring title, vs_menu *menu)
 {
-  items.push_back(item(' '+title+' ', menu));
+  items.push_back(item(L' '+title+L' ', menu));
 
   menu->shown_sig.connect(sigc::bind(sigc::mem_fun(*this, &vs_menubar::show_menu), menu));
   menu->hidden_sig.connect(sigc::bind(sigc::mem_fun(*this, &vs_menubar::hide_menu), menu));
@@ -137,26 +140,37 @@
 {
   int w=0;
 
+  // Calculate the size of the bar itself.
   for(itemlist::size_type i=0; i<items.size(); i++)
-    w+=items[i].title.size();
+    {
+      const wstring &title=items[i].title;
 
+      w+=wcswidth(title.c_str(), title.size());
+    }
+
+  // Expand the width as needed to account for active menus.
   for(activemenulist::iterator i=active_menus.begin(), num=0;
       i!=active_menus.end();
       i++, num++)
     {
       int menux=0;
-      // FIXME: be less horrendously inefficient
+
+      // Calculate the starting X location of this menu.
       for(itemlist::size_type j=0; j<items.size(); j++)
 	{
 	  if(items[j].menu==*i)
 	    break;
 
-	  menux+=items[j].title.size();
+	  const wstring &title=items[j].title;
+
+	  menux+=wcswidth(title.c_str(), title.size());
 	}
 
+      // Now expand our width request.
       w=max(w, menux+(*i)->width_request());
     }
 
+  // Expand the width to account for the subwidget.
   if(subwidget)
     w=max(w, subwidget->width_request());
 
@@ -189,18 +203,21 @@
 
 void vs_menubar::layout_me()
 {
+  // Find the starting X location of each active menu.
   for(activemenulist::iterator i=active_menus.begin();
       i!=active_menus.end();
       i++)
     {
       int menux=0;
-      // FIXME: be less horrendously inefficient
+
       for(itemlist::size_type j=0; j<items.size(); j++)
 	{
 	  if(items[j].menu==*i)
 	    break;
 
-	  menux+=items[j].title.size();
+	  const wstring &title=items[j].title;
+
+	  menux+=wcswidth(title.c_str(), title.size());
 	}
 
       int req_w=(*i)->width_request();
@@ -442,22 +459,32 @@
 	    i++)
 	  (*i)->display(st);
 
-      int loc=0, maxx=getmaxx();
+      int pos=0, maxx=getmaxx();
 
       apply_style(menubar_style);
       move(0, 0);
-      for(int i=0; i<maxx; i++)
-	addch(' ');
+      for(int i=0; i<maxx; i+=wcwidth(L' '))
+	add_wch(L' ');
 
-      for(itemlist::size_type i=0; i<items.size() && loc<maxx; i++)
+      move(0, 0);
+      for(itemlist::size_type i=0; i<items.size() && pos<maxx; i++)
 	{
 	  if(active && i==curloc)
 	    apply_style(highlightedmenubar_style);
 	  else
 	    apply_style(menubar_style);
 
-	  mvaddnstr(0, loc, items[i].title.c_str(), maxx-loc);
-	  loc+=items[i].title.size();
+	  wstring &title = items[i].title;
+	  size_t titleloc = 0;
+
+	  while(titleloc < title.size() && pos < maxx)
+	    {
+	      wchar_t wch=title[titleloc];
+
+	      add_wch(wch);
+	      pos+=wcwidth(wch);
+	      ++titleloc;
+	    }
 	}
     }
 }

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.h	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_menubar.h	Wed Jun 29 18:47:56 2005
@@ -18,10 +18,10 @@
 {
   struct item
   {
-    std::string title;
+    std::wstring title;
     vs_menu *menu;
 
-    item(std::string _title, vs_menu *_menu)
+    item(std::wstring _title, vs_menu *_menu)
       :title(_title), menu(_menu)
     {
     }
@@ -74,7 +74,7 @@
 
   void set_subwidget(vscreen_widget *w);
 
-  void append_item(std::string title, vs_menu *menu);
+  void append_item(std::wstring title, vs_menu *menu);
 
   void show_all();