:: このページの目次 {{outline}} {{ref_image gtk3_daily_scheduler.png}} !!! アプリケーションの機能  カレンダーの日付をダブルクリックすると、その日のスケジュールを入力・閲覧するためのウィンドウが表示されます。入力したデータは、スケジュールウィンドウを閉じた時、もしくはアプリケーションを終了した(カレンダーウィンドウを閉じた)時に、ユーザのホームフォルダ内の".gtk3_daily_scheduler"フォルダに保存されます。  一応--versionオプションおよび--helpオプションに対応していますが、"hsp3cl"ランタイムでコンパイルした時のみ有効になります。 !!! ソーススクリプトのダウンロード  {{ref gtk3_daily_scheduler_20160921.zip}} !!! メインのスクリプトとその説明 !! 名前が"_"で始まるラベルについて  これらのラベルはコーディング中の目印として置いたもので、スクリプトからは利用されていません。 !! 冒頭コメント {{include_html _code_gtk3_daily_scheduler, !0}} !! #define NAME_APP "gtk3_daily_scheduler" {{include_html _code_gtk3_daily_scheduler, !1}}  この文字列は、実行ファイル名、アプリケーションID(後述)、アプリケーションで入力されたデータの保存フォルダ名、versionオプションの出力テキスト、に使われています。 !! *_buildパート {{include_html _code_gtk3_daily_scheduler, !2}}  デバッグ実行および実行ファイル作成に関する設定を行っています。 !! *_includeパート {{include_html _code_gtk3_daily_scheduler, !3}} * h_myconsts.as ** サンプル作者が個人的によく使う定数をまとめたファイルです。ダウンロードアーカイブに含まれています。 * m_myutils.as ** サンプル作者が個人的によく使う汎用の関数やサブルーチンをまとめたファイルです。ダウンロードアーカイブに含まれています。 * modclbk.as ** tds12さんが[hsp.tvの掲示板|http://hsp.tv/play/pforum.php?mode=all&num=62130]で公開されたHSPでコールバック関数を使うためのスクリプトを保存したファイルです。ダウンロードアーカイブに含まれています。 * gtk+3.as ** GTK+関連のDLLに含まれる関数をHSPで使えるように#func命令で登録するスクリプトと、GTK+のプログラミングで使われる定数の定義の一部を保存したファイルです。実際はこの中でDLLごとに分けたものをさらにインクルードしています。ダウンロードアーカイブに含まれています。さらに詳しい説明が必要な場合は、[[こちらのページ|GTK関連ライブラリ(DLL)用HSPヘッダファイル]]を見てください。 * m_gtk+3utils.as ** サンプル作者自作の、GTK+3ライブラリを利用したユーティリティサブルーチン集です。ダウンロードアーカイブに含まれています。 !! *_constパート {{include_html _code_gtk3_daily_scheduler, !4}}  今回のサンプルアプリケーションでのみ使われる定数を定義しています。 * APPID ** GtkApplicationインスタンスに設定するアプリケーションID。詳しくは、[[最もシンプルなGTKウィンドウ|最もシンプルなGTKウィンドウ #hsp3 #gtk3]]のページのgtk_application_new関数の説明を見て下さい。 * PATH_DETAILS ** カレンダーに表示する休日情報が保存されているファイル、details.txtのパス。 * DATADIR ** アプリケーションで入力されたデータの保存フォルダパス。具体的には、アプリケーション使用ユーザのホームフォルダに作られる".gtk3_daily_scheduler"フォルダ。 * OPT_VERSION ブロック 〜 OPT_DETAILHEIGHT_ ブロック ** 各コマンドラインオプションに指定された引数を参照するための番号。およびGtkApplicationインスタンスにオプション情報を登録するためのデータ。詳細は各定数が使われるところで説明します。 * TITLE_WIN_CAL、TITLE_WIN_SCHE ** アプリケーションで使われるウィンドウのタイトル文字列。 !! *_subroutinesパート  今回のサンプルアプリケーションでのみ使われるサブルーチンをユーザ定義命令として定義しています。変数名の管理を楽にしたり、簡単に複数回実行できるようにする意味があります。  register_options、set_up_calendar_window、set_up_calendarの3つはアプリケーション初期化用の処理で、プログラム内で1度しか呼び出されません。  set_up_schedule_windowとset_up_listboxの2つは、カレンダーの日付がダブルクリックされた時、新しいウィンドウを開く必要がある場合に毎回実行されます。 ! register_options {{include_html _code_gtk3_daily_scheduler, !5}}  GtkApplication(GApplication)インスタンスに対して各コマンドラインオプションを登録する処理で、インスタンス生成直後に呼び出されています。 * 引数 ** app_: オプションを登録するGtkApplicationインスタンス ! set_up_calendar_window {{include_html _code_gtk3_daily_scheduler, !6}}  カレンダーを表示するウィンドウを生成して初期化する処理です。この命令とすぐ下のset_up_calendarは、GtkApplicationインスタンスのstartupシグナルのハンドラから呼び出されています。 * 引数 ** app_: ウィンドウを関連付けるGtkApplicationインスタンス ** win_: 生成されたGtkApplicationWindowインスタンスが入る変数 * gtk_application_window_new ** GtkApplicationWindowはGtkWindowと違い、生成時に引数に指定したGtkApplicationインスタンスに属するウィンドウがすべて閉じられると、自動的にイベントループを抜けるようになっています(gtk_main_quitの呼び出しが不要)。 ! set_up_calendar {{include_html _code_gtk3_daily_scheduler, !7}}  カレンダーを生成して初期化する処理です。 * 引数 ** cal_: 生成されたGtkCalenderインスタンスが入る変数 ** showdetails_: カレンダー上で各日付の詳細情報(detail)を表示するかどうかを表す真偽値。ページ冒頭のキャプチャ画像に表示あり・なし両方のウィンドウが含まれています。詳細情報とは、今回のサンプルで言うと、details.txtに保存されているテキストのことです。 ** detail_width_: 各日付の詳細情報を表示するエリアの横幅 ** detail_height_:各日付の詳細情報を表示するエリアの縦幅 * g_object_set ** GObjectライブラリの関数のひとつ。GObjectを継承したクラスのインスタンスに対して任意のプロパティを書き換えることができる。 ** この関数は、書き換えるプロパティ名と値を可変長引数として任意の数指定できる。サンプルソースでは、1ペア(2個)だけ指定できるg_object_setを"g_object_set1"という名前で登録しておいてそれを呼び出している。 ** 引数 *** p1: 対象のインスタンス *** p2〜: 書き換えるプロパティ名と値を任意の数指定 *** 最後の引数: 終わりの目印として0を渡す * gtk_calendar_set_detail_width_chars、gtk_calendar_set_detail_height_rows ** GTK+関連のインスタンスのプロパティを読み書きするもう一つの手段として、例えばこの2つのような各クラス専用の関数があります。 * gtk_calendar_set_detail_func ** GtkCalenderインスタンスに対して、各日付の詳細情報を返すコールバック関数を登録するための関数。 ** 引数 *** p1: 対象のインスタンス *** p2: コールバック関数のポインタ。サンプルでは、newclbk3命令で取得した値。 *** p3: コールバック関数呼び出し時に利用したい変数のポインタを指定する *** p4: ネットで見つけたサンプルを見る限り、基本NULL(0)で良いようです ** 登録するコールバック関数で何をすればいいのかというと、引数として渡されてくる日付の下に表示したい文字列を用意して、g_strdup関数でコピーした上でそのポインタをreturnします。要は、このコールバック関数が呼ばれる=GtkCalenderインスタンスが「この日付の下に表示してほしいテキストがあったらそのポインタをくれ」と言っているということです。ただこのイベントだけがシグナルになっていないのが謎ですが…… ** コールバック関数は_other_callback_functionsパートで定義しているのでそちらの説明も読んで下さい。 * gtk_calendar_get_display_options、gtk_calendar_set_display_options ** GtkCalenderインスタンスのカレンダー表示に関わるプロパティをまとめて読み書きできる関数です。 ! set_up_schedule_window {{include_html _code_gtk3_daily_scheduler, !8}}  カレンダーの各日付をダブルクリックした時に表示するウィンドウを生成して初期化する処理です。 ! set_up_listbox {{include_html _code_gtk3_daily_scheduler, !9}}  スケジュールウィンドウに配置するリストボックスを生成して初期化する処理です。 ! update_data_file_list {{include_html _code_gtk3_daily_scheduler, !10}}  アプリケーションのユーザが入力したデータを保存したファイルのリストを(再)作成する処理です。 ! mark_scheduled_days {{include_html _code_gtk3_daily_scheduler, !11}}  カレンダー上で、予定(アプリケーションのユーザが入力したデータ)が存在する日をマーク(太字化)する処理です。 !! *_class_modulesパート  ラベル名の"class"は俺用語で、「データとそれを扱う手続きをひとまとめにしたもののひな形」程度の意味です。今から思うとモジュール変数を直訳したmodule variablesでも良かったかもしれません。 !! #module win_sche _win, _entries, _year, _month, _day, _filepath {{include_html _code_gtk3_daily_scheduler, !30}}  今回のサンプルアプリケーションでのみ使われる、ユーザが予定を入力するウィンドウを表すモジュール変数を定義しています。 ! 初期化命令 {{include_html _code_gtk3_daily_scheduler, !12}} * ** ! load@win_sche {{include_html _code_gtk3_daily_scheduler, !13}} * ** ! comp_date@win_sche {{include_html _code_gtk3_daily_scheduler, !14}} * ** ! equal@win_sche {{include_html _code_gtk3_daily_scheduler, !15}} * ** ! activate@win_sche {{include_html _code_gtk3_daily_scheduler, !16}} * ** ! close@win_sche {{include_html _code_gtk3_daily_scheduler, !17}} * ** ! save@win_sche {{include_html _code_gtk3_daily_scheduler, !18}} * ** !! 重要な変数リスト {{include_html _code_gtk3_daily_scheduler, !19}} * ** !! *_mainパート {{include_html _code_gtk3_daily_scheduler, !20}} * ** !! *_signal_handlersパート 今回のサンプルアプリケーションで使われるシグナルハンドラの定義です。 ! *on_app_handlelocaloptions {{include_html _code_gtk3_daily_scheduler, !21}} * ** ! *on_app_startup {{include_html _code_gtk3_daily_scheduler, !22}} * ** ! *on_win_cal_deleteevent {{include_html _code_gtk3_daily_scheduler, !23}} * ** ! *on_cal_dayselecteddoubleclick {{include_html _code_gtk3_daily_scheduler, !24}} * ** ! *on_cal_monthchanged {{include_html _code_gtk3_daily_scheduler, !25}} * ** ! *on_win_sche_deleteevent {{include_html _code_gtk3_daily_scheduler, !26}} * ** !! *_other_callback_functionsパート 今回のサンプルアプリケーションで必要な、シグナルハンドラ以外のコールバック関数の定義です。 ! *cal_detailfunc {{include_html _code_gtk3_daily_scheduler, !27}} * ** !!! 参考にしたページ * [GtkCalendar: GTK+ 3 Reference Manual|https://developer.gnome.org/gtk3/stable/GtkCalendar.html]