OSDN Ticket Archive


Ticket #37374

macOS版 背景画像表示機能追加

登録: 2017-07-17 23:04 最終更新: 2017-07-17 23:22

報告者:
yknk
担当者:
yknk
チケットの種類:
機能リクエスト
状況:
完了
コンポーネント:
MIDITrail Ver.1.2.x for Mac OS X
マイルストーン:
Version 1.2.3 for macOS (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

背景画像を表示する機能を追加する。 iOS版の機能を移植する。(#36984 iOS版 背景画像表示機能追加)

チケットの履歴

2017-07-17 23:04 更新者: yknk
  • 新しいチケット "macOS版 背景画像表示機能追加" が作成されました
2017-07-17 23:19 更新者: yknk
コメント

仕様変更

  • グラフィック設定ダイアログで、背景に描画する画像ファイルを選択可能とする。
  • 背景画像ファイルパスはuserDefaultsに保存する。
  • 「View」メニューで背景表示のON/OFFを切り替えられるようにする。
  • 画像が選択されている場合は、画像を描画領域に内接表示する。

userDefaultsの変更点

----
Graphic
  Background-image   ←新規追加
    ImageFilePath    ←新規追加
      'path/to/file' ←設定例
----

グラフィック設定ダイアログ(MTGraphicCfgDlg)の変更点

  • 画像ファイルパス設定エディットボックスを追加。
  • ファイル選択ボタン(...)と設定クリアボタン(Clear)を追加。

ただし画像ファイルパス設定エディットボックスは、キーボードでの編集は不可とする。 Sandbox環境では、NSOpenPanelで選択されたファイル以外にアクセスできないため。

2017-07-17 23:19 更新者: yknk
コメント

画像ファイルパスの保存

Sandbox環境では、NSOpenPanelで画像ファイルを選択した直後は、その画像ファイルにアクセス可能である。 しかしアプリが再起動した後は、同じファイルパスであっても画像ファイルへのアクセスが失敗する。 画像ファイルのパスを保存するだけでは、再起動後に参照できなくなるため、Scurity-Scoped Bookmark を利用する。利用手順は次の通り。

  • NSOpenPanelで選択されたファイルのパス情報(NSURL)からScurity-Scoped Bookmarkを作成する。
  • Scurity-Scoped BookmarkをuserDefaultsに保存する。
  • userDefaultsからScurity-Scoped Bookmarkを取得する。
  • Scurity-Scoped BookmarkからNSURLに戻す。
  • NSURLが示すファイルにアクセスする前に、リソースアクセスを宣言する。
  • NSURLが示すファイルへのアクセスが終了したら、リソースアクセス終了を宣言する。

userDefaultsのScurity-Scoped Bookmark保存先のキーは次の通り。

SSBookmark/Background-image/ImageFileURL
参考サイト
App Sandbox Design Guide
https://developer.apple.com/library/content/documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW16

2017-07-17 23:20 更新者: yknk
コメント

対策

MTBackgroundImage

背景画像描画クラスを新規作成。

MTSecurityScopedBookmark

Security-Scoped Bookmarkクラスを新規作成。

MTMenuCtrl::initialize

メニューID一覧に「Background Image」の識別子MenuBackgroundImageを追加。

MTMenuCtrl::menuItemOf

「Background Image」のメニュー項目を返却する処理を追加。

MTMenuCtrl::onMenuBackgroundImage

新規追加メソッド。「Background Image」メニューが選択されたときに、 アプリケーションオブジェクトの表示効果設定メソッドOnMenuEnableEffectを呼び出す。

MIDITrailApp::OnMenuEnableEffect

「Background Image」メニューが選択されたときに、背景画像表示フラグのON/OFFを切り替える。

MIDITrailApp::_CreateScene

シーン生成時にシーンオブジェクトに対して、景画像表示フラグのON/OFFを設定する。

MIDITrailApp::_ChangeMenuStyle

「Background Image」メニューのスタイル更新処理を追加。

MIDITrailApp::_UpdateMenuCheckmark

「Background Image」メニューのチェックマーク表示処理を追加。

MIDITrailApp::_UpdateEffect

シーンオブジェクトへの背景画像表示設定反映処理を追加。

MTGraphicCfgDlg::init

画像ファイルパスと画像ファイルURLのメンバ変数初期化を追加。

MTGraphicCfgDlg::dealloc

画像ファイルパスと画像ファイルURLのメンバ変数解放処理を追加。

MTGraphicCfgDlg::onBtnImageFileBrowse

ファイル選択ボタン(...)が押された時、ファイル選択ダイアログを表示する。 ダイアログが閉じられた後、ファイルが選択された場合はエディットボックスに ファイルパスを反映する。 選択可能なファイルは"*.jpg *.png"とする。

MTGraphicCfgDlg::onBtnImageFileClear

ファイルクリアボタン(Clear)が押されたとき、エディットボックスを空にする。

MTGraphicCfgDlg::initDlg

ユーザ設定値読み込み処理loadConfFileの呼び出しを追加。 背景画像ファイルパス初期化処理initBackgroundImageFilePathの呼び出しを追加。

MTGraphicCfgDlg::initConfFile

ユーザ設定情報のカテゴリとセクション設定を追加。

MTGraphicCfgDlg::loadConfFile

ユーザ設定から、背景画像ファイルパスを取得する処理を追加。

MTGraphicCfgDlg::initBackgroundImageFilePath

背景画像ファイルパスエディットボックスの初期化処理を新規追加。

MTGraphicCfgDlg::saveConfFile

背景画像ファイルパスの保存処理を追加。

MTGraphicCfgDlg::saveAntiAlias

ユーザ設定情報のカテゴリとセクション設定を追加。

MTGraphicCfgDlg::saveBackgroundImage

背景画像設定保存処理を新規追加。 MTSecurityScopedBookmarkクラスを用いて、 Security-Scoped Bookmarkの作成と保存を行う。

MTScene.h

エフェクト種別のenumに"EffectBackgroundImage"を追加。

MTParam.h

背景画像ファイルパスの格納先の定義を追加。

MTScenePianoRoll3D, MTScenePianoRoll3DLive, MTScenePianoRollRain, MTScenePianoRollRainLive

メンバに背景画像描画オブジェクトを追加。 オブジェクト生成、描画、リリース、表示設定メソッドを修正。(Create,Draw,Release,SetEffect)

OGLTexture::LoadBitmap

テクスチャ画像読み込み時の画像サイズチェックを変更した。 ユーザが背景画像ファイルを選択することで、2048x2048より大きい画像を選択される可能性が高いため。

  • 変更前:2048x2048以内に収まっていればOK。
  • 変更後:OpenGLのテクスチャ画像最大サイズ(GL_MAX_TEXTURE_SIZE)の範囲以内に収まっていればOK。
2017-07-17 23:21 更新者: yknk
コメント

プロジェクトの設定変更

MIDITrail.entitlements

Scurity-Scoped Bookmarkを有効にするため、entitlementsに次の設定を追加する。

com.apple.security.files.bookmarks.app-scope YES

Deployment Target

Scurity-Scoped Bookmarkは、OS X 10.7.3(Lion)以降で利用可能であるため、 Deployment Targetを10.6から10.7に変更する。 これによりOS X 10.6(Snow Leopard)は、サポート対象外とする。

Targets / MIDITrail / General / Deployment Info / Deployment Target

2017-07-17 23:21 更新者: yknk
コメント

Scurity-Scoped Bookmarkの動作検証メモ

NSOpenPanelで選択されたファイルのパスをScurity-Scoped Bookmarkとして保存したあと、 そのファイルを削除/移動/リネーム/差し替えを行った時に、Security-Scoped Bookmarkから NSURLに戻すとき(URLByResolvingBookmarkData)何が起きるかを確認した。

検証結果

(1) ファイル削除 :URLByResolvingBookmarkData が失敗する
(2) ファイル移動 :stale = YES  URLは移動後のファイル名になっている
(3) ファイルリネーム :stale = YES  URLはリネーム後のファイル名になっている
(4) ファイル削除+ファイル差し替え :stale = YES  ファイル読み込みは成功する 差し替えられたファイルが開かれる
(5) ファイル移動+ファイル差し替え :stale = YES  ファイル読み込みは成功する 差し替えられたファイルが開かれる
(6) ファイルリネーム+ファイル差し替え :stale = YES  ファイル読み込みは成功する 差し替えられたファイルが開かれる

対応方針

  • staleは無視する。
  • (1)から(3)は、ファイル存在チェック時点で読み込み処理中断になるので、考慮する必要なし
2017-07-17 23:22 更新者: yknk
  • 解決法なし から 修正済み に更新されました
  • 状況オープン から 完了 に更新されました
  • チケット完了時刻2017-07-17 23:22 に更新されました

添付ファイルリスト

添付ファイルはありません