--- nono/wx/wxtextscreen.h 2026/04/29 17:04:28 1.1.1.1 +++ nono/wx/wxtextscreen.h 2026/04/29 17:05:48 1.1.1.13 @@ -1,51 +1,104 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // -#pragma once - -#include "wxtextpanel.h" - // -// テキストスクリーン風コントロール +// テキストスクリーンを描画するパネル // + // wxPanel // ↓ -// WXTextPanel テキストフォントを管理するクラス +// WXTextPanel テキストフォントを描画するクラス // ↓ -// WXTextScreen テキストフォントを使ったテキストスクリーン -// +// WXTextScreen テキストスクリーンを表示するパネル + +#pragma once + +#include "wxtextpanel.h" +#include "geometric.h" + class WXTextScreen : public WXTextPanel { - typedef WXTextPanel inherited; + using inherited = WXTextPanel; public: - WXTextScreen(wxWindow *parent, int col, int row, const uint16 *textbuf); - virtual ~WXTextScreen(); - - // XXX - void SetTextSize(int col, int row); + // テキストスクリーンは本来単純なキャラクタビットマップ構造のため、 + // クライアント領域の端の1ピクセルまでふんだんに使用している。 + // ウィンドウマネージャ側でこのウィンドウに枠などをつけてくれる場合は + // あまり問題にならないが、枠などを一切つけないタイプのウィンドウ + // マネージャでこのウィンドウを表示するとウィンドウの縁に接する文字の + // 視認性が(文字とウィンドウ外の背景の組み合わせによっては)すこぶる + // 悪くなる。そのため、テキストスクリーンの周囲に余白をもたせる。 + static const int DefaultPadding = 3; - void OnPaint(wxPaintEvent&); - void OnSize(wxSizeEvent&); + public: + WXTextScreen(wxWindow *parent, const nnSize& screensize); + ~WXTextScreen() override; // フォントサイズ変更 - void SetFontSize(fontsize_t fontsize); + void FontChanged() override; + + void Fit() override; + + // テキストスクリーンを取得 (WXTextScreen を継承せずに更新する人のため) + TextScreen& GetScreen() { return screen; } + + // パディングサイズ変更 + void SetPadding(int l, int t, int r, int b); + // パディングサイズ取得 + int GetPaddingLeft() const { return pad_left; } + int GetPaddingTop() const { return pad_top; } + int GetPaddingRight() const { return pad_right; } + int GetPaddingBottom() const { return pad_bottom; } + int GetPaddingX() const { return GetPaddingLeft() + GetPaddingRight(); } + int GetPaddingY() const { return GetPaddingTop() + GetPaddingBottom(); } + + // 桁数、行数を取得する + int GetCol() const { return screen.GetCol(); } + int GetRow() const { return screen.GetRow(); } + + // 指定の桁数行数の時のピクセル数を取得する + int GetScreenWidth(int col_) const; + int GetScreenHeight(int row_) const; + + // クライアント座標 pos をテキスト座標(桁、行)に変換して返す + // (パディング領域では戻り値が負数になることに注意) + wxPoint GetTextPosition(const wxPoint& pos) const; + + // TextScreen のユーザデータ取得、設定 + uint64 GetUserData() const { return screen.userdata; } + void SetUserData(uint64 value) { screen.userdata = value; } + + // コンテキストメニューイベントを解除 + // (ここのコンテキストメニューを使いたくない人が呼ぶ) + void DisconnectContextMenu(); + + protected: + TextScreen screen {}; + std::vector prevbuf {}; private: - void Draw(wxDC& dc); + void OnSize(wxSizeEvent&); + void OnContextMenu(wxContextMenuEvent&); + void OnCopy(wxCommandEvent&); + + void Init(int col, int row); + void ResetFit(); + void InvalidateText(); + void Draw() override; + + // コンテキストメニューを接続 + void ConnectContextMenu(); + + int pad_left {}; + int pad_top {}; + int pad_right {}; + int pad_bottom {}; - const uint16 *textbuf = NULL; - uint16 *prevbuf = NULL; - uint8 *bmpbuf = NULL; - wxImage *image = NULL; - wxBitmap *bitmap = NULL; - - int col = 0; - int row = 0; - int view_width = 0; - int view_height = 0; + // 余白を塗りつぶす場合は true + bool draw_padding {}; wxDECLARE_EVENT_TABLE(); };