[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();