• R/O
  • SSH
  • HTTPS

jd4linux: Commit


Commit MetaInfo

Revision4206 (tree)
Time2015-02-02 22:54:45
Authorweise

Log Message

optimized rendering tab labels, more and more (ref.4197)

Change Summary

Incremental Difference

--- jd/trunk/src/skeleton/tabnote.cpp (revision 4205)
+++ jd/trunk/src/skeleton/tabnote.cpp (revision 4206)
@@ -633,7 +633,7 @@
633633 int label_width_org; // 変更前のタブの文字数
634634 int label_width; // 変更後のタブの文字数
635635 int width_total = 0;
636- int n, tab_width, layout_width;
636+ int tab_width, max_width;
637637
638638 for( int i = 0; i < pages; ++i ){
639639
@@ -645,7 +645,9 @@
645645
646646 bool cut_suffix = false;
647647 label_width_org = label_width = ulabel.length();
648+
648649 tab_width = -1; // タブ幅を未計算状態に初期化
650+ max_width = avg_width_tab * ( i + 1 ) - width_total; // 最大値 ( 収まらないときマイナスになる )
649651
650652 // 長すぎるタブの文字列は表示しないよう、あらかじめ最大値を256に制限する
651653 if( label_width > 256 ){
@@ -653,7 +655,7 @@
653655 ulabel.resize( label_width );
654656 }
655657
656- // 一端、全てのタブの幅を平均値以下に縮める
658+ // タブの幅を最大値以下に縮める
657659 while( label_width > CONFIG::get_tab_min_str() ){
658660
659661 if( ! cut_suffix && label_width < label_width_org ){
@@ -662,56 +664,63 @@
662664 }
663665
664666 m_layout_tab->set_text( ulabel );
665- tab_width = m_layout_tab->get_pixel_logical_extents().get_width() + label_margin;
667+ int width = m_layout_tab->get_pixel_logical_extents().get_width() + label_margin;
666668
667669 #ifdef _DEBUG_RESIZE_TAB
668- std::cout << "s " << i << " " << width << " / " << avg_width_tab
670+ std::cout << "s " << i << " " << width << " / " << max_width << " + " << width_total
669671 << " lng = " << label_width << " : " << ulabel << std::endl;
670672 #endif
673+ if( width < max_width ){ // 最大値以下
674+ tab_width = width; // タブ幅を保存
675+ break;
676+ }
671677
672- if( tab_width < avg_width_tab ) break; // 平均値以下
673-
674- n = 1;
675- if( label_width > 16 && tab_width > avg_width_tab * 2 ){
676- n = label_width / 4; // 2倍以上差がある場合は、1/4文字を消す
678+ // 最大値を越えていたら、概算で収まるように縮める
679+ int n = label_width - (int)( (double)label_width * max_width / width );
680+ if( n < 1 ) n = 1;
681+ if( label_width - n < CONFIG::get_tab_min_str() ){
682+ n = label_width - CONFIG::get_tab_min_str();
677683 }
678684 label_width -= n;
679685 ulabel.erase( label_width, n ); // 末尾のn文字を消す
680- tab_width = -1; // タブ幅を初期化
681686 }
682687
683688 // 横をはみださないようにタブ幅を延ばしていく
684689 for(;;){
685690
686- if( label_width >= label_width_org ) break;
691+ if( label_width >= label_width_org ) break; // 全て収まった
692+ if( max_width < 0 ) break; // 確実に収まらない
687693
688694 ulabel.insert( label_width, 1, ulabel_org[ label_width ] ); // 末尾の1文字を戻す
689695 ++label_width;
690696
691697 m_layout_tab->set_text( ulabel );
692- layout_width = m_layout_tab->get_pixel_logical_extents().get_width() + label_margin;
698+ int width = m_layout_tab->get_pixel_logical_extents().get_width() + label_margin;
693699
694700 #ifdef _DEBUG_RESIZE_TAB
695- std::cout << "w " << i << " " << width << " / " << avg_width_tab
696- << " total= " << width_total + width << " / " << avg_width_tab * ( i + 1 )
701+ std::cout << "w " << i << " " << width << " / " << max_width << " + " << width_total
697702 << " lng = " << label_width << " : " << ulabel << std::endl;
698703 #endif
699704 // 最大値を越えたらひとつ戻してbreak;
700- if( width_total + layout_width > avg_width_tab * ( i + 1 ) ){
705+ if( width > max_width ){
701706 --label_width;
702707 ulabel.erase( label_width, 1 ); // 末尾の1文字を消す
703708 break;
704709 }
705- tab_width = layout_width; // 最大値を超えていないタブ幅を保存
710+ tab_width = width; // 最大値を超えていないタブ幅を保存
706711 }
707712
708713 // タブ幅を確定する
709714 if( tab_width < 0 ){
710715 m_layout_tab->set_text( ulabel );
711- width_total += ( m_layout_tab->get_pixel_logical_extents().get_width() + label_margin );
712- } else {
713- width_total += tab_width;
716+ tab_width = m_layout_tab->get_pixel_logical_extents().get_width() + label_margin;
717+
718+#ifdef _DEBUG_RESIZE_TAB
719+ std::cout << "f " << i << " " << tab_width << " / " << max_width << " + " << width_total
720+ << " lng = " << label_width << " : " << ulabel << std::endl;
721+#endif
714722 }
723+ width_total += tab_width;
715724
716725 tab->resize_tab( label_width );
717726 }
--- jd/trunk/src/jddebug.h (revision 4205)
+++ jd/trunk/src/jddebug.h (revision 4206)
@@ -12,6 +12,9 @@
1212 #ifdef _DEBUG_CARETMOVE
1313 #include <iostream>
1414 #endif
15+#ifdef _DEBUG_RESIZE_TAB
16+#include <iostream>
17+#endif
1518
1619 #include <assert.h>
1720
Show on old repository browser