--- nono/wx/wxtextscreen.h 2026/04/29 17:04:28 1.1 +++ nono/wx/wxtextscreen.h 2026/04/29 17:05:12 1.1.1.8 @@ -1,51 +1,92 @@ // // 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; + + // テキストスクリーンは本来単純なキャラクタビットマップ構造のため、 + // クライアント領域の端の1ピクセルまでふんだんに使用している。 + // ウィンドウマネージャ側でこのウィンドウに枠などをつけてくれる場合は + // あまり問題にならないが、枠などを一切つけないタイプのウィンドウ + // マネージャでこのウィンドウを表示するとウィンドウの縁に接する文字の + // 視認性が(文字とウィンドウ外の背景の組み合わせによっては)すこぶる + // 悪くなる。そのため、テキストスクリーンの周囲に余白をもたせる。 + static const int DefaultPadding = 3; public: - WXTextScreen(wxWindow *parent, int col, int row, const uint16 *textbuf); - virtual ~WXTextScreen(); + WXTextScreen(wxWindow *parent, const nnSize& screensize); + virtual ~WXTextScreen() override; - // XXX - void SetTextSize(int col, int row); + // フォントサイズ変更 + void FontChanged() override; - void OnPaint(wxPaintEvent&); - void OnSize(wxSizeEvent&); + // テキストスクリーンを取得 (WXTextScreen を継承せずに更新する人のため) + TextScreen& GetScreen() { return screen; } - // フォントサイズ変更 - void SetFontSize(fontsize_t fontsize); + // パディングサイズ変更 + 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 GetCol() const { return screen.GetCol(); } + int GetRow() const { return screen.GetRow(); } + + // クライアント座標 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&); - 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; + void Init(int col, int row); + void DoSize(); + void InvalidateText(); + void Draw() override; + + // コンテキストメニューを接続 + void ConnectContextMenu(); + + int pad_left {}; + int pad_top {}; + int pad_right {}; + int pad_bottom {}; wxDECLARE_EVENT_TABLE(); };