Skip to content
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

マウスホイールでのフォントサイズ変更をパーセンテージに基づいて行うようにする #1513

Merged

Conversation

suconbu
Copy link
Member

@suconbu suconbu commented Jan 23, 2021

PR の目的

Ctrl + マウスホイール操作でフォントサイズ変更する機能を使いやすくします。

#1491 で検討した内容の反映になります。

カテゴリ

  • 仕様変更

PR の背景

現在のフォントサイズ変更機能 (ズーム機能) には以下のような使いづらい点がありました。

  • 大きいサイズでの変化が唐突で調整がしづらい。
  • 設定したフォントサイズによっては一度サイズ変更するとマウスホイール操作では元のサイズに戻せない。
  • サイズ変化の仕方が他のアプリケーション (ウェブブラウザなど) と違うため違和感がある。
    他は 100% を基準として 110%, 120%, ... のように変化するのに対して、サクラエディタは決められたサイズの中から選択となっている。

これらを解消したいというのが動機になります。

PR のメリット

  • 「背景」に挙げた点が解消できます。

PR のデメリット (トレードオフとかあれば)

  • 最小/最大のフォントサイズまで変更する時の操作量が増えます。

仕様・動作説明

1. マウスホイールによるフォントサイズ変更の動作変更

現在は予め決められたサイズの中から選択していたものが、変更後は基準となるフォントサイズにズーム倍率を適用したサイズが使われます。

  • ズーム倍率は 1% から 900% の 72 段階を持ちます。(一段あたりの変化率を 10~20% に設定)
  • ズーム倍率適用後のフォントサイズは 0.5pt 単位で切り捨てます。
  • (最小/最大サイズの範囲内において) ホイール操作をした時に必ずフォントサイズが変化するよう、必要に応じてズーム倍率の段階をスキップします。
  • 変更可能なフォントサイズの範囲は 1pt ~ 72pt とします。
  • フォント設定ダイアログ等で上記範囲を超えたサイズが設定された場合はそのサイズが上限となります。

※経緯は #1491 (comment) を参照

2. ステータスバー倍率表示の仕様変更

倍率が小さい値の時にズーム操作した際でも倍率の変化が分かるよう、倍率が 5% 未満の時には小数第一位まで表示するようにします。
(現状の整数表示では例えば 1.25% から 1.5% に変化した時、共に 1% と表示されてしまう)

3. 「1」に伴うマクロコマンド SetFontSize の動作変更

  • 直接指定で設定できるフォントサイズの範囲が 8~72pt から 1~72pt に変更されます。
  • 相対指定については「マウスホイールによるフォントサイズ変更の動作変更」と同様にズーム倍率を元にしたサイズ設定がされるようになります。

PR の影響範囲

  • マウスホイールによるフォントサイズ変更動作
  • マクロコマンド SetFontSize の振る舞い

テスト内容

テスト1

基本的な拡大/縮小操作 (1~3) と、上限 (72pt) を超えたサイズが設定された状態からの動作 (4~6) を確認します。

  1. フォント設定ダイアログでフォントサイズに10ptを設定する。
  • 確認1:ステータスバーの倍率表示が100%になっていること。
  1. Ctrl+マウスホイール操作 (手前から奥) を繰り返す。
  • 確認2:フォントサイズが徐々に大きくなること。
  • 確認3:ステータスバーの倍率表示の増加が「720%」で止まること。
  1. Ctrl+マウスホイール操作 (奥から手前) を繰り返す。
  • 確認4:フォントサイズが徐々に小さくなること。
  • 確認5:ステータスバーの倍率表示の減少が「10%」で止まること。
  1. フォント設定ダイアログでフォントサイズに100ptを設定する。
  • 確認6:ステータスバーの倍率表示が「100%」になっていること。
  1. Ctrl+マウスホイール操作 (手前から奥) を繰り返す。
  • 確認7:フォントサイズとステータスバーの倍率表示が「100%」のまま変化しないこと。
  1. Ctrl+マウスホイール操作 (奥から手前) を繰り返す。
  • 確認8:ステータスバーの倍率表示の減少が「1.0%」で止まること。
  • 確認9:ステータスバーの倍率表示について 5% 未満の時に小数第一位まで表示されること。

テスト2

マウスホイール操作で実行されない処理をマクロ実行により確認します。
(フォントサイズはフォント設定ダイアログにて確認)

  1. SetFontSize( 1, 0, 0 ); を実行する。
  • 確認1:フォントサイズが 1pt
  1. SetFontSize( 1000, 0, 0 ); を実行する。
  • 確認2:フォントサイズが 72pt
  1. SetFontSize( 0, -5, 0 ); を実行する。
  • 確認3:フォントサイズが 36pt
  1. SetFontSize( 0, 5, 0 ); を実行する。
  • 確認4:フォントサイズが 72pt
  1. SetFontSize( 100, 0, 0 ); を実行する。
  • 確認5:フォントサイズが 10pt

関連 issue, PR

#1491
#1490
#1485
https://sourceforge.net/p/sakura-editor/patchunicode/398/

参考資料

ズーム動作の参考にした主なアプリケーション:
GoogleChrome, VisualStudio2019, VisualStudioCode, EmEditor, Mery, Excel

@suconbu suconbu force-pushed the feature/use_percentage_in_zooming branch from 005f5a6 to 717ce6c Compare January 23, 2021 17:32
@AppVeyorBot
Copy link

Build sakura 1.0.3366 completed (commit 71e86df685 by @suconbu)

@AppVeyorBot
Copy link

Build sakura 1.0.3367 completed (commit 50b83fe8b6 by @suconbu)

@suconbu suconbu marked this pull request as draft January 24, 2021 00:25
0.1, 0.11, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9,
1.0, 1.1, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0,
10.0, 11.0, 12.5, 15.0, 17.5, 20.0, 22.5, 25.0, 27.5, 30.0, 35.0, 40.0, 45.0, 50.0, 60.0, 70.0, 80.0, 90
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この書き方ってわかりづらくないですか?

  1. この配列が何か不明。一度変数に入れてやれば変数名で表現できます。
  2. 配列要素の想定型が不明。サフィックス省略なのでconst (&double)[n]だと思います。

解決したいのは 1 のほうで、auto使ってもいいので名前が欲しいです。

const auto xxx = {...};

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

意味合い的に constexpr ですね。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

対応しました。
配列を使うと CodeSmell になってしまったため std::array としています。
(constexpr にしたいために std::vector ではなく std:array を選択しました)

	constexpr std::array<double, 72> aZoomFactors = {
		0.01, 0.011, 0.0125, 0.015, 0.0175, 0.02, 0.0225, 0.025, 0.0275, 0.03, 0.035, 0.04, 0.045, 0.05, 0.06, 0.07, 0.08, 0.09,

@param[in] nValueMax 上限値
@param[in] nValueUnit 値の最小単位
*/
ZoomSetting::ZoomSetting( std::initializer_list<double> iZoomFactors, double nValueMin, double nValueMax, double nValueUnit )
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

さっきの配列はinitializer_listでしたか。
うまく説明できませんが違和感があります。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

initializer_list 型の引数には initializer_list しか渡せないこと、空ではない initializer_list を動的に生成することはできないことから、このコンストラクタに実行時に計算した値を指定することができなくなっています。

sanomari さんの違和感とは別件かもしれませんが、私が腑に落ちなかったのはこの点です。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

開始/終了イテレータを受け取る形にしました。
※ユニットテスト用に std::initializer_list<double> を受け取るオーバーロードは残しました。

	template<class InputIter>
	ZoomSetting( InputIter iterZoomFactorsFirst, InputIter iterZoomFactorsLast, double nValueMin, double nValueMax, double nValueUnit ) :

m_nValueMax = nValueMax;
m_nValueUnit = nValueUnit;

// 正当性確認
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

うまく説明できませんが、コンストラクタに正当性確認があることに違和感があります。

validじゃないインスタンスは使えないんですよね?
PR差分ページを上から順番に見てるので、後続処理を意識せずに書いています。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

私は正当性確認の必要性そのものに疑問を覚えました。

CViewCommander での実際の使用例を見ると、すべての引数が定数になっています。開発者が間違った値を指定していないか?という検査を行っていることになりますが、ここのコードは Release ビルドでも有効なので、全ユーザーの環境で実行されることになります。

開発時に確認する必要があるのは分かりますので、別の関数にして必要な時に呼んだ方がいいと思います。

Copy link
Member Author

@suconbu suconbu Jan 30, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

正当性判定処理を関数化しました。今回はユニットテストから使用します。

/*!
	@brief 設定値の正当性判定
*/
bool ZoomSetting::IsValid() const

Copy link
Contributor

@sanomari sanomari left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Smell A 26 Code Smells

今回追加したコード内にCodeSmellsがあるのが気になりました。
完全新規のコードで対応できない理由はないと思うので対応して欲しいです。

75.6% 75.6% Coverage

SonarCloudの合格ラインは8割なので、もう少しです。
マクロを使えば sakura_core/cmd/CViewCommander_Settings.cpp の修正コードを実行させることができると思います。

やらなくていいと言われそうですが、できる範囲では対応しておきたいです。

@berryzplus
Copy link
Contributor

マクロを使えば sakura_core/cmd/CViewCommander_Settings.cpp の修正コードを実行させることができると思います。

これはやってほしいです。
tests/unittests/test-winmain.cppにマクロ呼出を追加してやれば、コードを動かすこと自体はできるはずです。

strStartupMacro += L"ExitAll();"; //NOTE: このコマンドにより、エディタプロセスは起動された直後に終了する。

SetFontSize(0, 1, 2); //フォントサイズアップ
SetFontSize(0, -1, 2); //フォントサイズダウン

実行した結果どうなったかを確認できないのが悲しいですが、とりあえず動かしてみることでコードの実行によってクラッシュしないことくらいは確認できると思っています。

完全新規のコードで対応できない理由はないと思うので対応して欲しいです。

対応しない理由を合意できれば放置でよいと思います。
例)誤検知だから。

@suconbu
Copy link
Member Author

suconbu commented Jan 25, 2021

解決したいのは 1 のほうで、auto使ってもいいので名前が欲しいです。

倍率テーブルの渡し方を見直します。

コンストラクタに正当性確認があることに違和感があります。

ZoomSetting クラスは不変としたため初期化時に行うこととしています。

完全新規のコードで対応できない理由はないと思うので対応して欲しいです。

対応しない理由を合意できれば放置でよいと思います。

対応します。
修正不要と判断したものは SonarCloud の方に理由コメントしてみます。

マクロを使えば sakura_core/cmd/CViewCommander_Settings.cpp の修正コードを実行させることができると思います。

tests/unittests/test-winmain.cppにマクロ呼出を追加してやれば、コードを動かすこと自体はできるはずです。

カバレッジ確保には役立てられそうです。教えて頂きありがとうございます。

m_nValueMax = nValueMax;
m_nValueUnit = nValueUnit;

// 正当性確認
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

私は正当性確認の必要性そのものに疑問を覚えました。

CViewCommander での実際の使用例を見ると、すべての引数が定数になっています。開発者が間違った値を指定していないか?という検査を行っていることになりますが、ここのコードは Release ビルドでも有効なので、全ユーザーの環境で実行されることになります。

開発時に確認する必要があるのは分かりますので、別の関数にして必要な時に呼んだ方がいいと思います。

@brief ズーム設定を保持
*/
class ZoomSetting
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このクラス、メンバ変数を private にする意味あるかな?と思いました。コンストラクタで設定した値を公開するのが目的なら、public な const メンバ変数でも要求は満たせると思います。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

対応しました。
用途や構成から struct 型が適切と思われたので見直しました。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

struct 型が適切

struct型は private型を持つことができない特殊な class 型です。
この型をconst変数で宣言して使う分にはきっと問題ないですが、非const(≒書き替え可能)な変数で使うなら考慮が必要っす。(どっちのパターンかは見てない)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

struct型は private型を持つことができない特殊な class 型です。

いえ、struct でも private 指定はできますよ。C++ の struct はデフォルトで public な class です。(class がデフォルトで private な struct であるとも言えます)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

いえ、struct でも private 指定はできますよ。C++ の struct はデフォルトで public な class です。(class がデフォルトで private な struct であるとも言えます)

知らんかったです。
structでもprivateにできるんですね。

structとclassの違い

キーワード 日本語 C言語 C++ 用途
struct 構造体 使える 使える 独自データのメモリレイアウトを定義して公開する。
class クラス 使えない 使える 特定の役割・操作を定義してインターフェースを公開する。

メモリレイアウトを公開するためにstructを使うんだと考えたら、
privateなメンバーを持たせてしまうと「何それ?」になります。
privateなメンバーは公開されないので、レイアウト公開してないじゃん、ってことになるので。

インターフェースを公開するためにclassを使うんだと考えたら、
ファンクタ(=operator()を持つstruct)を見ると「何これ?」になります。

よくよく考えるとstructにもvirutal関数を定義できますが、
virtual関数を定義したら仮想関数テーブルがメモリレイアウトに組み込まれるので、
公開されないメンバーを追加することになりますね。

まぁ、色々ありまっせ、ということなのかな。。。

@param[in] nValueMax 上限値
@param[in] nValueUnit 値の最小単位
*/
ZoomSetting::ZoomSetting( std::initializer_list<double> iZoomFactors, double nValueMin, double nValueMax, double nValueUnit )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

initializer_list 型の引数には initializer_list しか渡せないこと、空ではない initializer_list を動的に生成することはできないことから、このコンストラクタに実行時に計算した値を指定することができなくなっています。

sanomari さんの違和感とは別件かもしれませんが、私が腑に落ちなかったのはこの点です。

@suconbu
Copy link
Member Author

suconbu commented Jan 27, 2021

指摘いただいた ZoomSetting まわりの修正を行いました。

引き続いてカバレッジ向上と CodeSmell 駆除を行っていきます。

@suconbu suconbu force-pushed the feature/use_percentage_in_zooming branch from 1ea48ff to b808323 Compare January 27, 2021 16:09
@suconbu
Copy link
Member Author

suconbu commented Jan 28, 2021

zoom.cpp のコード量が増えたためかかろうじて 80% 超えられましたが、
test-winmain.cpp からのマクロ実行は、別プロセス実行だからなのかカバレッジには反映されないようですね。

引き続き残った CodeSmell を対応します。

@suconbu suconbu force-pushed the feature/use_percentage_in_zooming branch 2 times, most recently from a01244c to dc18ceb Compare January 28, 2021 16:03
int originalPointSize = m_pEditDoc->m_pcEditWnd->GetFontPointSize( false );
auto_sprintf( szFontSize, LS( STR_STATUS_FONTSIZE ), 100 * currentPointSize / originalPointSize );
const double nZoomPercentage = m_pEditDoc->m_blfCurTemp ? (m_pEditDoc->m_nCurrentZoom * 100.0) : 100.0;
if( nZoomPercentage < 5.0 ){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここ多分こういうことですよね。

if( const double nZoomPercentage = m_pEditDoc->m_nCurrentZoom * 100.0;
    m_pEditDoc->m_blfCurTemp && nZoomPercentage < 5.0 ){
}else if( m_pEditDoc->m_blfCurTemp ){
}else{
    //nZoomPercentage = 100%
}

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m_nCurrentZoom は一時設定の時に限り有効な値が設定されるので、else で「nZoomPercentage = 100%」とはならないんです。
CodeSmell 指摘についてはこう修正しておこうと思います。

    if( const double nZoomPercentage = m_pEditDoc->m_blfCurTemp ? (m_pEditDoc->m_nCurrentZoom * 100.0) : 100.0;
        nZoomPercentage < 5.0 ){
        auto_sprintf( szFontSize, LS( STR_STATUS_FONTZOOM_1 ), nZoomPercentage );
    }else{
        auto_sprintf( szFontSize, LS( STR_STATUS_FONTZOOM_0 ), nZoomPercentage );
    }

あと、auto_sprintfauto_sprintf_s に差し替えておいた方がいいですね。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一晩寝て思ったんですけど

 if( const double nZoomPercentage = GetZoomPercentage(); nZoomPercentage < 5.0 ){

と書けるなら読みづらさは解消するのかもです。

m_nCurrentZoom は一時設定の時に限り有効な値が設定されるので、else で「nZoomPercentage = 100%」とはならないんです。

う~む。設計とコードがズレてるかも知れないです。

double nZoomPercentage = m_pEditDoc->m_blfCurTemp ? (m_pEditDoc->m_nCurrentZoom * 100.0) : 100.0;

m_pEditDoc->m_blfCurTemp が真(0以外)のとき、m_pEditDoc->m_nCurrentZoom の 100倍を設定。
m_pEditDoc->m_blfCurTemp が偽(0)のとき、固定値 100 を設定。

あと、コード全体をよく見れてないぼくが悪いのかも知らんですが、
zoomが5%未満のときだけ小数点以下1桁を表示するのはなんでかな?と思いました。

ほか、これは読み飛ばしてもらってかまいません。

  • 拡大率って普通 ratio じゃね? 😃
  • 浮動小数点を表すハンガリアン記法って n ではなくて f とか d のような・・・。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if( const double nZoomPercentage = GetZoomPercentage(); nZoomPercentage < 5.0 ){
と書けるなら読みづらさは解消するのかもです。

確かにこれが良いですね。
m_blfCurTemp の値によって取得する値を選ぶ関数が既存で CEditWnd にいくつかあるので、ここに追加します。

zoomが5%未満のときだけ小数点以下1桁を表示するのはなんでかな?と思いました。

コードだけ見ると謎ですよね。PR 説明を更新して「仕様・動作説明」の所に理由を書きました。

浮動小数点を表すハンガリアン記法

特定のプリミティブ型に依存しない「数値」(Numeric) で n ということで良いかと思います。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m_blfCurTemp の値によって取得する値を選ぶ関数が既存で CEditWnd にいくつかあるので、ここに追加します。

これを対応するとまたコードカバレッジが 80% 切ってしまいそうですが大目に見て下さい😅

@@ -3460,7 +3460,8 @@ BEGIN
STR_ERR_DLGEDITVW6 "■"
STR_MENU_KEYWORDINFO "Copy Keyword description to clipboard"
STR_MENU_OPENKEYWORDDIC "Open keyword dictionary"
STR_STATUS_FONTSIZE "%4d %%"
STR_STATUS_FONTZOOM_0 "%4.0f %%"
STR_STATUS_FONTZOOM_1 "%4.1f %%"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あれ?書式文字列はリソースに持っていいんですか?
既存リソースに含まれているのは置いておいて、
「書式記号を翻訳してはならない」というルールを説明できますか?

たとえば、フランス語は小数点にカンマ(,)を使うんですけど、
「'%4.1f %%'」を「'%4,1f %%'」と翻訳したらおかしなことになります。(落ちます)

安全にリソース化できないのでリソース化しない、が妥当な回避策だと思います。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

心配点は理解できました。※小数点の件、確かドイツ語もそうですね
(誤って翻訳された場合) 今回のは起動したらすぐ落ちるので良い(?)ですが、たまにしか使われないリソースだと特にまずいですね。

書式文字列に対して翻訳が掛かっていないかどうかについては、何かしらチェックツールを用意して機械的に検知させるというのはどうでしょうか。

@suconbu suconbu force-pushed the feature/use_percentage_in_zooming branch from 063c7db to 3776778 Compare January 30, 2021 13:29
@suconbu suconbu marked this pull request as ready for review January 30, 2021 13:31
@AppVeyorBot
Copy link

Build sakura 1.0.3411 failed (commit 99ccb7df34 by @suconbu)

@suconbu
Copy link
Member Author

suconbu commented Jan 30, 2021

あらら……?

@suconbu
Copy link
Member Author

suconbu commented Jan 31, 2021

原因不明ですがリベース後にエラーが出てしまっているので対処します。

d:\a\1\s\sakura_core\util\zoom.cpp(162): fatal error C1001: An internal error has occurred in the compiler. 

@beru beru added the specification change ■仕様変更 label Feb 2, 2021
@AppVeyorBot
Copy link

Build sakura 1.0.3424 completed (commit c02e481247 by @suconbu)

@suconbu
Copy link
Member Author

suconbu commented Feb 4, 2021

原因不明ですがリベース後にエラーが出てしまっているので対処します。

理由は分かりませんでしたが、以下の const を除くことで解消できました。

for( [[maybe_unused]] const double _ : zoomSetting.m_vZoomFactors ){

@AppVeyorBot
Copy link

Build sakura 1.0.3425 completed (commit 050c902542 by @suconbu)

sakura_core/util/zoom.cpp Show resolved Hide resolved

// 最小単位で丸めた後の値が変更前の値から変わらなければ
// 変わる位置までインデックスを動かしていく
// 本当は無限ループで良いが万一の暴走回避のため有限回
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nNextIndex が範囲外なら抜けるはずなので対策不要では?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ループ毎に必ず nNextIndex が変化するため杞憂だったかもしれません。
ここは while( true ) に戻します。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここは通常の for でインデックスを動かすよう見直しました。

Copy link
Contributor

@berryzplus berryzplus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

残課題ですが、カバレッジが8割を下回っています。

8割超えるのが無理ならばその理由を共有して「ではスルーで。」と言えるかどうかレビューしたらいいように思います。

0.01, 0.011, 0.0125, 0.015, 0.0175, 0.02, 0.0225, 0.025, 0.0275, 0.03, 0.035, 0.04, 0.045, 0.05, 0.06, 0.07, 0.08, 0.09,
0.1, 0.11, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9,
1.0, 1.1, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0,
10.0, 11.0, 12.5, 15.0, 17.5, 20.0, 22.5, 25.0, 27.5, 30.0, 35.0, 40.0, 45.0, 50.0, 60.0, 70.0, 80.0, 90.0
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ところで、この定数値の根拠ってなんでしたっけ?
(「話聞けよ!」ってなっていたらスンマセン…)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

刻み方については #1491 (comment) で試作したものに近い変化率でかつ、パーセントで表示した時に切りの良い値としています。
最小・最大については、1pt から 72pt (7200%) へ、72pt から 1pt (1.38%) へとズームさせるのに十分な範囲としました。

sakura_core/cmd/CViewCommander_Settings.cpp Show resolved Hide resolved
sakura_core/cmd/CViewCommander_Settings.cpp Show resolved Hide resolved
}
nPointSize = (int)nPointSizeF;

// フォントサイズが変わらないなら終了
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ん?

sakura_core/cmd/CViewCommander_Settings.cpp Show resolved Hide resolved
sakura_core/doc/CEditDoc.h Show resolved Hide resolved
@@ -3409,7 +3409,8 @@ BEGIN
STR_ERR_DLGEDITVW6 "■"
STR_MENU_KEYWORDINFO "キーワードの説明をクリップボードにコピー"
STR_MENU_OPENKEYWORDDIC "キーワード辞書を開く"
STR_STATUS_FONTSIZE "%4d %%"
STR_STATUS_FONTZOOM_0 "%4.0f %%"
STR_STATUS_FONTZOOM_1 "%4.1f %%"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

指摘じゃありませんが、結局残存してるのを確認。

// 最小単位で丸めた後の値が変更前の値から変わらなければ
// 変わる位置までインデックスを動かしていく
// 本当は無限ループで良いが万一の暴走回避のため有限回
for( [[maybe_unused]] double _ : zoomSetting.m_vZoomFactors ){
Copy link
Contributor

@berryzplus berryzplus Feb 5, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここ拡張for(=「要素:コレクション」と書いてコレクションに含まれる要素に繰り返し操作を行う、比較的新しい形式のfor文)に見えるので、コメントの「インデックスを動かしていく」のくだりが実装とあってない気がします。

どちらかというと、拡張forが使えるところに無限ループ書くやり方に違和感あります。
あと、コードをちゃんと見れてないですが maybe unusedが「ん?」って感じです。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここは無限ループの書き方でなく通常の for でインデックス (nNextIndex) を進めるよう改めます。

@brief ズーム設定を保持
*/
class ZoomSetting
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

struct 型が適切

struct型は private型を持つことができない特殊な class 型です。
この型をconst変数で宣言して使う分にはきっと問題ないですが、非const(≒書き替え可能)な変数で使うなら考慮が必要っす。(どっちのパターンかは見てない)

* インデックス取得関数を拡大・縮小で別にする
* インデックスを探すループを通常のforに変更
* ズーム設定の正当性判定関数をtest-zoom.cppに移動する
@suconbu suconbu force-pushed the feature/use_percentage_in_zooming branch from 6b44ff0 to a87ad8b Compare February 8, 2021 05:12
@suconbu
Copy link
Member Author

suconbu commented Feb 8, 2021

runEditorProcess の待ち合わせスレッドから呼ぶ CControlProcess_Terminate の手前に (マクロの実行が済むまでに十分な) Sleep を入れる。

ローカルでテスト実行する時の待ち時間が長すぎてしまうと不便かなと思い、Sleep は 10 秒にしました。(実際の実行所要時間は 3 秒前後)

@suconbu suconbu force-pushed the feature/use_percentage_in_zooming branch from a87ad8b to dd48ee1 Compare February 8, 2021 05:30
@AppVeyorBot
Copy link

Build sakura 1.0.3438 completed (commit 71a8486f54 by @suconbu)

@AppVeyorBot
Copy link

Build sakura 1.0.3439 completed (commit 4ad8a3e709 by @suconbu)

* mode=2でフォントサイズが変更されないパスを通るマクロを追加
* SetFontSizeの第一引数が1/10pt単位になっていなかったのを修正
@suconbu suconbu force-pushed the feature/use_percentage_in_zooming branch from dd48ee1 to aa25ffa Compare February 8, 2021 09:06
@sonarqubecloud
Copy link

sonarqubecloud bot commented Feb 8, 2021

Kudos, SonarCloud Quality Gate passed!

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 2 Code Smells

99.0% 99.0% Coverage
0.0% 0.0% Duplication

@AppVeyorBot
Copy link

Build sakura 1.0.3440 completed (commit dce110c60d by @suconbu)

@@ -304,11 +301,6 @@ void CViewCommander::Command_SETFONTSIZE( int fontSize, int shift, int mode )
return;
}
nPointSize = (int)nPointSizeF;

// フォントサイズが変わらないなら終了
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GetZoomedValue がズーム倍率を変更できない場合には false を返す仕様としていることから、ここは true になることがない if 文でしたので変数 nCurrentPointSize と合わせて削除しました。

</Project>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ファイル末尾の行末改行、「無し」から「有り」に変更。
スルーしますけど戻してもスルーする気がします。

@@ -251,18 +254,28 @@ void CViewCommander::Command_FONT( void )
/*! フォントサイズ設定
@param fontSize フォントサイズ(1/10ポイント単位)
@param shift フォントサイズを拡大or縮小するための変更量(fontSize=0のとき有効)
@param mode フォントサイズ設定対象(0:フォント設定 1:タイプ別設定(なければ0と同じ) 2:一時適用フォント)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

既存設計なのでどうしようもないですが、マジックナンバーやめたいっす。

@brief 現在のズーム倍率を取得
@return 1.0を等倍とするズーム倍率
*/
double CEditWnd::GetFontZoom()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このPRに含めなくてよいですが...

Suggested change
double CEditWnd::GetFontZoom()
double CEditWnd::GetFontZoom() const noexcept
  1. メンバーを変更しないので const にできます。
  2. この関数の呼出し元で例外を考慮しなくてよいことを noexcept で示せます。

*/
double CEditWnd::GetFontZoom()
{
if( GetDocument()->m_blfCurTemp ){
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

対応の必要はないですが👆でnoexceptを付けるならこうなるはずです。

Suggested change
if( GetDocument()->m_blfCurTemp ){
if( const auto pDocument = GetDocument(); pDocument && pDocument->m_blfCurTemp ){

やらんでも良いですが。

@@ -277,6 +277,9 @@ TEST_F( WinMainTest, runEditorProcess )
// コントロールプロセスの初期化完了を待つ
CControlProcess_WaitForInitialized( szProfileName );

// 起動時実行マクロが全部実行し終わるのを待つ
::Sleep( 10000 );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

後で触る気マンマンですが、とりあえずこの対応で文句ありません。

</Project>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

もう1個のfiltersと同じです。

改行あるのとないのとどっちが正しいか分からないですが、これがテキストファイルだとすれば最終行にも行末記号を付けるべき(POSIX標準)らしいです。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Visual Studio で編集すると末尾改行は削除されるはずですが、その他のエディタでも編集することがあるのなら、.editorconfiginsert_final_newline = false を指定しておくのが良いかもしれません。

Copy link
Member Author

@suconbu suconbu Feb 8, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

リベースでのコンフリクト修正時に使用したエディタ (vim) により自動的に追加されたものを見落としてしまいました。

.editorconfig に insert_final_newline = false を指定しておくのが良いかもしれません。

ありがとうございます。この設定で末尾改行を除去できるか試してみます。

@suconbu
Copy link
Member Author

suconbu commented Feb 8, 2021

ありがとうございました。マージします。

@suconbu suconbu merged commit 73d4fe7 into sakura-editor:master Feb 8, 2021
@arigayas
Copy link

arigayas commented Feb 8, 2021

開発作業お疲れさまでした。

早速、
サクラエディタ v2.4.2.0 64bit dev Alpha Version
(GitHash dce110c)
(GitURL https://github.com/sakura-editor/sakura)

  Compile Info: V_A641928 WPR WIN601/I800/C000/N601
  Last Modified: 2021/2/8 18:10:20

を使って試してみました。

ちゃんと試していませんが「フォント設定」ダイアログを開くまでは
Ctrl+マウスホイールで拡大縮小が機能していないような気がします。

@arigayas
Copy link

arigayas commented Feb 8, 2021

あれ?「Last Modified: 2021/2/8 18:10:20」ってあるから何かがおかしい?

@suconbu
Copy link
Member Author

suconbu commented Feb 8, 2021

Ctrl+マウスホイールで拡大縮小が機能していないような気がします。

動作を見て頂きありがとうございます。
master をビルドして実行した場合でも同じ現象が起きることを確認しました。

sakura.ini なしで起動した時に、フォントサイズ相対設定の基準値として参照する CommonSetting_View::m_nPointSize の値が 0 となるようです。(これ自体は PR 対応以前より)
PR 対応前はこの状態であっても、Ctrl + マウスホイール操作をした際にサイズテーブルの一番小さな値 (=8pt) が選択され、(動作として少し変ですが) ズーム動作は機能していました。
しかし、PR 対応後は基準値に倍率を掛ける設計になったことが影響して、拡大/縮小操作をしても「値変化なし」と扱われてしまっています。

@suconbu
Copy link
Member Author

suconbu commented Feb 8, 2021

sakura.ini が存在していない時に CommonSetting_View::m_nPointSize0 になってしまう事がそもそも問題かもしれませんが、仮に '0' の場合でも救済措置として従来相当の動作 (=下限値を基準とする) はできるよう対応しようと思います。

@arigayas
Copy link

arigayas commented Feb 8, 2021

私が真っさらなサクラエディタを試してみてバグが発覚して良かったのでしょうか?(汗)

@suconbu
Copy link
Member Author

suconbu commented Feb 8, 2021

私が真っさらなサクラエディタを試してみてバグが発覚して良かったのでしょうか?(汗)

これほど容易に起きるバグを見逃してしまった事はまずいと認識しています😔
今回、私が CI ビルドの生成物を使った動作確認を怠っていました。

@arigayas
Copy link

arigayas commented Feb 8, 2021

PRを作成していただけでもめっちゃくちゃ有難いです!!

@suconbu
Copy link
Member Author

suconbu commented Feb 9, 2021

ありがとうございます。
バグ以外にも動作で気になる点などありましたらぜひ教えて下さい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
specification change ■仕様変更
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants