-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
タブ幅が半角単位8桁を超える場合でも下線が最後まで描画されるようにする #1673
Conversation
// tabDispWidth <= 8 ? tabDispWidth : 8, // Sep. 22, 2002 genta | ||
nLen, | ||
szForeViewString.c_str(), | ||
static_cast<UINT>(szForeViewString.length()), | ||
pMetrics->GetDxArray_AllHankaku() // FIXME:半角固定? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここでは半角文字の文字間隔配列を取得していますが、タブ記号には全角文字も設定できるので、
GenerateDxArray2()
の方が良いのかもしれません。
ただ、全角文字を指定しても現状正しく表示されているように見えるので、実害があるのか判断できませんでした。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
指摘ではありませんが、タブ幅の最小値って2なんでしたっけ?
最小値に1以下を指定できるとしたら、この修正内容と関係なく問題ありな気がします。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
おそらく設定できます。
タイプ別ダイアログのコードを見たところ、スピンコントロールに対して「正の整数で1~64の範囲内」という入力規則が設定されていました。
sakura/sakura_core/typeprop/CPropTypesScreen.cpp
Lines 412 to 418 in 0843eb9
if( nVal < 1 ){ | |
nVal = 1; | |
} | |
if( nVal > 64 ){ | |
nVal = 64; | |
} | |
::SetDlgItemInt( hwndDlg, IDC_EDIT_TABSPACE, nVal, FALSE ); |
タブ幅を1にしている人がいないとも限らないので、GenerateDxArray2を使用するように仕様変更(=このPRには含めない)しましょうか?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
めんどくさそうな感じっすねw
TAB幅に1を指定するのは趣味だと思うので、放置しましょう。
TAB幅に1を指定してあるのなら、
タブ描画に使うカスタム文字に全角文字を指定できてはいけない気がします。
TAB幅2未満のときだけ全角文字を無効とする、ないし、TAB描画文字に全角を指定したときは幅を2未満にできないようにする、みたいな修正を入れておくのがベターだと思います。
(自己責任っちゅうことで、放置でよいような・・・)
✅ Build sakura 1.0.3782 completed (commit 6a7a98bffe by @kazasaku) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
不具合内容は了解しました。
修正したほうがよい、も合意です。
なんとなく、必要でない箇所が直ってるように見えています。
・どのコードが原因で不具合が起きてました。だから直しました。
・修正と関連して、こういう修正を行いました。
という2点がハッキリしないのが気になってます。
::ExtTextOut( | ||
gr, | ||
sPos.GetDrawPos().x, | ||
sPos.GetDrawPos().y, | ||
ExtTextOutOption() & ~(bTrans? ETO_OPAQUE: 0), | ||
&rcClip2, | ||
L" ", | ||
8, | ||
szBackViewString.c_str(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
不具合修正として直すべき箇所はココだけのように見えました。
const CTextMetrics* pMetrics=&pcView->GetTextMetrics(); | ||
const CTextArea* pArea=&pcView->GetTextArea(); | ||
|
||
int nLineHeight = pMetrics->GetHankakuDy(); | ||
int nCharWidth = pMetrics->GetCharPxWidth(); // Layout→Px |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
換算方法の見直しで使用されなくなるので除去
(CLayoutMgr由来のピクセル単位数値は、CLayoutMgrの持つ基準値で換算すべき。)
CLayoutXInt tabDispWidthLayout = pcView->m_pcEditDoc->m_cLayoutMgr.GetActualTsvSpace( sPos.GetDrawCol(), L',' ); | ||
int tabDispWidth = (Int)tabDispWidthLayout; | ||
CLayoutXInt nTabLayoutWidth = pcLayoutMgr.GetActualTsvSpace(sPos.GetDrawCol(), L','); | ||
size_t nTabDispWidth = static_cast<Int>(nTabLayoutWidth) / pcLayoutMgr.GetWidthPerKeta(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
変数名変更
nTabLayoutWidht:タブのレイアウト幅(ピクセル単位数値)
nTabDispWidth:タブの表示幅(半角単位桁数)
nTabDispWidhtは後でsize_t型の値と演算するのでsize_tで宣言します。
rcClip2.right = rcClip2.left + nCharWidth * tabDispWidth; | ||
rcClip2.right = rcClip2.left + static_cast<Int>(nTabLayoutWidth); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
変更前はタブのピクセル幅に文字のピクセル幅を乗じていました。
(この計算結果は事実上「桁数×ピクセル単位文字幅^2」になってしまいます。)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
見直したら2乗にならないことがわかりました。
sakura/sakura_core/view/CTextMetrics.h
Line 60 in 6b4f0a8
[[nodiscard]] int GetCharPxWidth() const { return 1; } |
ただ、tabDispWidthの中身はピクセル単位数値なのだから、この演算をする意味はないと思います。
if( rcClip2.left < pArea->GetAreaLeft() ){ | ||
rcClip2.left = pArea->GetAreaLeft(); | ||
} | ||
rcClip2.top = sPos.GetDrawPos().y; | ||
rcClip2.bottom = sPos.GetDrawPos().y + nLineHeight; | ||
int nLen = wcslen( m_pTypeData->m_szTabViewString ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Smell:未使用変数の定義・縮小型変換
SonarCloud Quality Gate failed. |
@@ -58,51 +56,53 @@ void CFigure_Comma::DispSpace(CGraphics& gr, DispPos* pDispPos, CEditView* pcVie | |||
DispPos& sPos=*pDispPos; | |||
|
|||
//必要なインターフェース | |||
const CLayoutMgr& pcLayoutMgr = pcView->GetDocument()->m_cLayoutMgr; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CLayoutMgrを編集可能な状態でアクセスする必要はないので、const参照経由で使用します。
void _DispTab( CGraphics& gr, DispPos* pDispPos, const CEditView* pcView ); | ||
|
||
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // | ||
// CFigure_Comma // | ||
// CFigure_Comma // |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CFigure_Tab.cppをコピーした名残だと思われます。
未定義かつ使用されることはないと思うので消してしまいます。
nCharWidth * tabDispWidth - (nPosLeft - sPos.GetDrawPos().x), // Tab Area一杯に 2013/4/11 Uchi | ||
static_cast<Int>(nTabLayoutWidth) - (nPosLeft - sPos.GetDrawPos().x), // Tab Area一杯に 2013/4/11 Uchi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここもタブのピクセル幅に文字のピクセル幅を乗じていました。
加筆しました。 |
✅ Build sakura 1.0.3784 completed (commit 469fcb1c26 by @kazasaku) |
このPRは全く関係無いですが、ローカルでビルドしたときに次のような差分表示がVSのステータスバーに出ます。
身に覚えのない大規模変更(99%ということは、リポジトリ内のほぼすべてのファイルということ?)なのですごい謎です。 |
gitの設定が影響していませんかね?
https://qiita.com/yoshiplur/items/568d1e83c54a5c68da30 ここのリポジトリはなんかおかしいので、autocrlf=trueを設定したほうが使いやすいです。「良識」に従えば、改行コードの自動変換は行うべきじゃないんですが、理解して設定するのをとやかく言うのは違うと思います。 こんな感じでコマンド叩けばそのうち治ると思います。 git config core.autoCRLF true
git config core.safeCRLF warn
git remote remove origin
git remote add origin [email protected]:sakura-editor/sakura.git
git fetch project --prune remoteがいっぱいある場合はそれぞれ対処が必要っす。 |
前にcore.autocrlfをtrueにして別にcloneしたことがあったんですが、そっちはincludeGuard.ps1に差分が出て 作業前にソリューションをクリーンして、buildディレクトリを削除すれば「0」に戻るので、当分はinputのままでいきます。 |
なんかわかった気がします。 #1666 が原因ですね。 ぼくのとこでは、 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
問題なさそうに見えます。
確認ありがとうございます。 他に指摘等なければ近日中にマージしようと思います。 |
マージします。ご確認ありがとうございます。 |
PR の目的
タブ記号の描画処理に関する不具合を修正します。
カテゴリ
背景
patchunicode#1053 で指摘されている通り、タブ記号に対して下線を描画する設定が有効になっている際、
下線が半角単位8桁分しか描画されない不具合が存在します。
対策を行って、下線がタブ幅いっぱいに描画されるようにします。
再現手順
参考画像
PR のメリット
PR のデメリット (トレードオフとかあれば)
仕様・動作説明
この不具合は、タブ記号の描画幅が最長で8桁に固定されているためです。
なお、タブ幅の上限値は「64」です。
以前よりタブの描画処理ではタブ幅をCLayoutMgrから取得するようになっていましたので、この PR では取得した値を半角単位桁数に換算し、タブ描画文字列の長さが換算値よりも小さければ不足分を補うようにしました。
(以下、前後比較)
タブ表示文字列は最大で8字分しかないため、下線はそこまでしか描画されない。
なお、長い矢印表示の場合、矢印だけはタブ幅いっぱいに描画されます。
なお、既存パッチでは不具合と関係しない他の変更が同時に実施されているように見えたため、既存パッチは利用していません。
PR の影響範囲
テスト内容
変更後のサクラエディタで前述した手順を再現し、発生しないことを確認します。
TSV/CSVモードでのテストは、添付のファイル( 6be2aec のビルドログ)を開いてタイプ別設定を変更し、設定が反映されたときの描画結果を確認します。
各自で用意したカンマ区切り・タブ区切りテキストでも確認できます。
test-file.zip
なお、TAB通常表示およびTAB矢印表示における影響は下表の通りです。
TAB表示の設定を切り替えてそれぞれの描画を確認してください。
表示モード↓
確認方法
スクリーンタブ:TAB幅に「8」を超える値を設定する
スクリーンタブ:TAB表示に確認したい表示形式(上記表を参照)を設定
カラータブ:色指定でTAB記号の下線を有効にする
sample_buildlog_x64_release.txt
を開くスクリーンタブ:折り返し方法を「折り返さない」に設定
スクリーンタブ:TAB表示に確認したい表示形式(上記表を参照)を設定
スクリーンタブ:レイアウトセクション一番下のコンボボックスを「TSV」に設定する
カラータブ:色指定でTAB記号の下線を有効にする
sample_buildlog_x64_release.csv
を開くスクリーンタブ:折り返し方法を「折り返さない」に設定
スクリーンタブ:レイアウトセクション一番下のコンボボックスを「CSV」に設定する
カラータブ:色指定でTAB記号の下線を有効にする
いずれのパターンにおいて、次の2点が確認できれば問題ないと思います。
関連 issue, PR
close: patchunicode#1053
#1645 … 単位を桁数に戻した場合はタブ記号描画幅の計算処理も必ず変更しなければなりません。