1 /*****************************************
2  * DockBrushValue
3  *
4  * ブラシの項目値
5  *****************************************/
6 /*
7  * DockBrushValue (mContainer : 垂直)
8  *  |- 名前、ボタン
9  *  |- mContainerView (area = 垂直コンテナ)
10  *      |- mExpander
11  *          |- 項目
12  *      |- ...
13  *
14  */
15 
16 #include "mDef.h"
17 #include "mWidget.h"
18 #include "mContainerDef.h"
19 #include "mContainer.h"
20 #include "mContainerView.h"
21 #include "mLabel.h"
22 #include "mButton.h"
23 #include "mCheckButton.h"
24 #include "mArrowButton.h"
25 #include "mBitImgButton.h"
26 #include "mComboBox.h"
27 #include "mExpander.h"
28 #include "mEvent.h"
29 #include "mMenu.h"
30 #include "mStr.h"
31 #include "mUtilStr.h"
32 #include "mTrans.h"
33 
34 #include "defConfig.h"
35 #include "defPixelMode.h"
36 
37 #include "ValueBar.h"
38 #include "SelMaterial.h"
39 #include "PressureWidget.h"
40 
41 #include "BrushList.h"
42 #include "BrushItem.h"
43 #include "ConfigData.h"
44 
45 #include "trgroup.h"
46 
47 
48 //-----------------------
49 
50 typedef struct _DockBrushValue
51 {
52 	mWidget wg;
53 	mContainerData ct;
54 
55 	mContainerView *ctview;
56 
57 	mWidget *ctview_area,	//mContainerView のエリア
58 		*wg_brushsave,
59 		*wg_watermenu,
60 		*wg_btt_waterpreset[CONFIG_WATER_PRESET_NUM];
61 	mLabel *label_name;
62 	mCheckButton *ck_travelling_dir,
63 		*ck_antialias,
64 		*ck_curve;
65 	mComboBox *cb_type,
66 		*cb_pixmode,
67 		*cb_hosei_type,
68 		*cb_hosei_str,
69 		*cb_press_type;
70 	ValueBar *bar_radius,
71 		*bar_opacity,
72 		*bar_min_size,
73 		*bar_min_opacity,
74 		*bar_interval,
75 		*bar_rand_size,
76 		*bar_rand_pos,
77 		*bar_water[3],
78 		*bar_hard,
79 		*bar_rough,
80 		*bar_angle,
81 		*bar_angle_rand;
82 	SelMaterial *selmat_brush,
83 		*selmat_texture;
84 	PressureWidget *pressure_wg;
85 }DockBrushValue;
86 
87 //-----------------------
88 
89 //ウィジェットID と共通
90 enum
91 {
92 	TRID_HEADER_MAIN = 10,
93 	TRID_HEADER_MIN,
94 	TRID_HEADER_RANDOM,
95 	TRID_HEADER_WATER,
96 	TRID_HEADER_SHAPE,
97 	TRID_HEADER_SHAPE_ROTATE,
98 	TRID_HEADER_PRESSURE,
99 	TRID_HEADER_OTHER,
100 
101 	TRID_TYPE = 100,
102 	TRID_RADIUS,
103 	TRID_OPACITY,
104 	TRID_PIXELMODE,
105 	TRID_HOSEI_TYPE,
106 	TRID_MIN_SIZE,
107 	TRID_MIN_OPACITY,
108 	TRID_INTERVAL,
109 	TRID_RAND_SIZE,
110 	TRID_RAND_POS,
111 	TRID_WATER_PRESET,
112 	TRID_WATER_PARAM1,
113 	TRID_WATER_PARAM2,
114 	TRID_WATER_PARAM3,
115 	TRID_HARD,
116 	TRID_ROUGH,
117 	TRID_TRAVELLING_DIR,
118 	TRID_ANGLE,
119 	TRID_ANGLE_RAND,
120 	TRID_TEXTURE,
121 	TRID_ANTIALIAS,
122 	TRID_CURVE,
123 
124 	TRID_TYPE_TOP = 200,
125 	TRID_HOSEITYPE_TOP = 220,
126 	TRID_PRESSURETYPE_TOP = 230,
127 
128 	TRID_WATERPRESET_REGIST = 240,
129 	TRID_WATERPRESET_RESET
130 };
131 
132 //文字列IDと共通しないウィジェットID
133 enum
134 {
135 	WID_BTT_SAVE_BRUSH = 2000,
136 	WID_BTT_DETAIL_OPTION,
137 	WID_CB_HOSEI_STR,
138 	WID_BTT_WATER_PRESET_MENU,
139 	WID_SELMAT_BRUSH,
140 	WID_CB_PRESSURE_TYPE,
141 	WID_PRESSURE_EDIT,
142 
143 	WID_BTT_WATER_PRESET_TOP = 2100
144 };
145 
146 //-----------------------
147 /* ConfigData::dockbrush_expand_flags
148  * 各項目の展開フラグ */
149 
150 enum
151 {
152 	EXPAND_F_MAIN   = 1<<0,
153 	EXPAND_F_MIN    = 1<<1,
154 	EXPAND_F_RANDOM = 1<<2,
155 	EXPAND_F_WATER  = 1<<3,
156 	EXPAND_F_SHAPE  = 1<<4,
157 	EXPAND_F_SHAPE_ROTATE = 1<<5,
158 	EXPAND_F_PRESSURE = 1<<6,
159 	EXPAND_F_OTHER  = 1<<7
160 };
161 
162 //-----------------------
163 
164 mBool BrushDetailDlg_run(mWindow *owner,BrushItem *item);
165 
166 static void _create_widget(DockBrushValue *p,mWidget *parent);
167 static int _event_handle(mWidget *wg,mEvent *ev);
168 
169 //-----------------------
170 
171 //保存ボタン (1bit:12x12)
172 static const uint8_t g_img1bit_save[] =
173 {
174 	0xff,0x0f,0x0f,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0xff,0x0f,0x07,0x0e,0x07,0x0e,
175 	0x07,0x0e,0x07,0x0e,0x07,0x0e,0xff,0x0f
176 };
177 
178 //詳細設定ボタン (2bit:12x12)
179 static const unsigned char g_img2bit_option[]={
180 0x55,0x55,0x05,0xa9,0xaa,0x06,0x59,0x55,0x06,0xa9,0xaa,0x06,0x59,0x55,0x06,0xa9,
181 0xaa,0x29,0x59,0x59,0x95,0xa9,0x5a,0x96,0x59,0x96,0x5a,0xa9,0x5a,0x96,0x55,0x59,
182 0x95,0x00,0xa0,0x29 };
183 
184 //-----------------------
185 
186 
187 
188 //==============================
189 // sub
190 //==============================
191 
192 
193 /** 塗りのリストセット */
194 
_set_pixelmode_list(DockBrushValue * p,BrushItem * pi)195 static void _set_pixelmode_list(DockBrushValue *p,BrushItem *pi)
196 {
197 	int num;
198 
199 	num = BrushItem_getPixelModeNum(pi);
200 
201 	//リスト変更
202 
203 	if(num != mComboBoxGetItemNum(p->cb_pixmode))
204 	{
205 		M_TR_G(TRGROUP_PIXELMODE_BRUSH);
206 
207 		mComboBoxDeleteAllItem(p->cb_pixmode);
208 
209 		mComboBoxAddTrItems(p->cb_pixmode, num, 0, 0);
210 	}
211 
212 	//選択
213 
214 	mComboBoxSetSel_index(p->cb_pixmode, pi->pixelmode);
215 }
216 
217 /** 半径のバー情報セット */
218 
_set_radius_bar(DockBrushValue * p,BrushItem * pi)219 static void _set_radius_bar(DockBrushValue *p,BrushItem *pi)
220 {
221 	if(pi->type == BRUSHITEM_TYPE_FINGER)
222 	{
223 		ValueBar_setStatus_dig(p->bar_radius, 0,
224 			BRUSHITEM_FINGER_RADIUS_MIN, BRUSHITEM_FINGER_RADIUS_MAX, pi->radius);
225 	}
226 	else
227 		ValueBar_setStatus_dig(p->bar_radius, 1, pi->radius_min, pi->radius_max, pi->radius);
228 }
229 
230 /** 形状画像による項目の有効/無効 */
231 
_enable_by_shapeimage(DockBrushValue * p)232 static void _enable_by_shapeimage(DockBrushValue *p)
233 {
234 	BrushItem *pi = BrushList_getEditItem();
235 
236 	//ドットペン/指先以外で、形状画像がない場合、「硬さ」を有効
237 
238 	mWidgetEnable(M_WIDGET(p->bar_hard),
239 		(pi->type != BRUSHITEM_TYPE_DOTPEN && pi->type != BRUSHITEM_TYPE_FINGER && !pi->shape_path));
240 }
241 
242 /** ブラシタイプ変更による有効/無効 */
243 
_enable_by_brushtype(DockBrushValue * p,int type)244 static void _enable_by_brushtype(DockBrushValue *p,int type)
245 {
246 	mBool noblur,nodot,no_blur_dot,water,nofinger,no_dot_finger;
247 	int i;
248 
249 	noblur = (type != BRUSHITEM_TYPE_BLUR);
250 	nodot  = (type != BRUSHITEM_TYPE_DOTPEN);
251 	nofinger = (type != BRUSHITEM_TYPE_FINGER);
252 	water = (type == BRUSHITEM_TYPE_WATER);
253 
254 	no_blur_dot = (noblur && nodot);
255 	no_dot_finger = (nodot && nofinger);
256 
257 	/* 水彩以外時は [水彩] を無効。
258 	 * 水彩時は、[塗り] を無効。
259 	 *
260 	 * ぼかし時は、[塗り][濃度最小][間隔] を無効。
261 	 *
262 	 * ドットペン時は、[半径][最小&間隔][ランダムサイズ&位置]
263 	 *  [ブラシ形状][形状回転][筆圧][アンチエイリアス/曲線補間] を無効。
264 	 *
265 	 * 指先時は、[半径][濃度][補正][テクスチャ] 以外を無効。 */
266 
267 	mWidgetEnable(M_WIDGET(p->bar_radius), nodot);
268 	mWidgetEnable(M_WIDGET(p->cb_pixmode), (noblur && !water && nofinger));
269 
270 	mWidgetEnable(M_WIDGET(p->bar_min_size), no_dot_finger);
271 	mWidgetEnable(M_WIDGET(p->bar_min_opacity), (no_blur_dot && nofinger));
272 	mWidgetEnable(M_WIDGET(p->bar_interval), (no_blur_dot && nofinger));
273 
274 	mWidgetEnable(M_WIDGET(p->bar_rand_size), no_dot_finger);
275 	mWidgetEnable(M_WIDGET(p->bar_rand_pos), no_dot_finger);
276 
277 	//水彩
278 
279 	for(i = 0; i < 3; i++)
280 		mWidgetEnable(M_WIDGET(p->bar_water[i]), water);
281 
282 	for(i = 0; i < CONFIG_WATER_PRESET_NUM; i++)
283 		mWidgetEnable(p->wg_btt_waterpreset[i], water);
284 
285 	mWidgetEnable(p->wg_watermenu, water);
286 
287 	//
288 
289 	mWidgetEnable(M_WIDGET(p->selmat_brush), no_dot_finger);
290 	mWidgetEnable(M_WIDGET(p->bar_rough), no_dot_finger);
291 
292 	mWidgetEnable(M_WIDGET(p->ck_travelling_dir), no_dot_finger);
293 	mWidgetEnable(M_WIDGET(p->bar_angle), no_dot_finger);
294 	mWidgetEnable(M_WIDGET(p->bar_angle_rand), no_dot_finger);
295 
296 	mWidgetEnable(M_WIDGET(p->cb_press_type), no_dot_finger);
297 	mWidgetEnable(M_WIDGET(p->pressure_wg), no_dot_finger);
298 
299 	mWidgetEnable(M_WIDGET(p->ck_antialias), no_dot_finger);
300 	mWidgetEnable(M_WIDGET(p->ck_curve), no_dot_finger);
301 
302 	_enable_by_shapeimage(p);
303 }
304 
305 
306 //==============================
307 // main
308 //==============================
309 
310 
311 /** DockBrushValue 作成 */
312 
DockBrushValue_new(mWidget * parent)313 DockBrushValue *DockBrushValue_new(mWidget *parent)
314 {
315 	DockBrushValue *p;
316 	mWidget *ct;
317 	mBitImgButton *bib;
318 	mContainerView *ctv;
319 
320 	//------ DockBrushValue (mContainer)
321 
322 	p = (DockBrushValue *)mContainerNew(sizeof(DockBrushValue), parent);
323 
324 	p->wg.notifyTarget = MWIDGET_NOTIFYTARGET_SELF;
325 	p->wg.fLayout = MLF_EXPAND_WH;
326 	p->wg.event = _event_handle;
327 
328 	//------ ブラシ名+ボタン
329 
330 	ct = mContainerCreate(M_WIDGET(p), MCONTAINER_TYPE_HORZ, 0, 5, MLF_EXPAND_W);
331 
332 	ct->margin.bottom = 4;
333 
334 	//ブラシ名
335 
336 	p->label_name = mLabelCreate(ct,  MLABEL_S_BORDER, MLF_EXPAND_W | MLF_MIDDLE, 0, NULL);
337 
338 	//保存ボタン
339 
340 	p->wg_brushsave = (mWidget *)mBitImgButtonCreate(ct, WID_BTT_SAVE_BRUSH, 0, MLF_MIDDLE, 0);
341 
342 	mBitImgButtonSetImage(M_BITIMGBUTTON(p->wg_brushsave),
343 		MBITIMGBUTTON_TYPE_1BIT_BLACK_WHITE, g_img1bit_save, 12, 12);
344 
345 	//詳細設定ボタン
346 
347 	bib = mBitImgButtonCreate(ct, WID_BTT_DETAIL_OPTION, 0, MLF_MIDDLE, 0);
348 
349 	mBitImgButtonSetImage(bib, MBITIMGBUTTON_TYPE_2BIT_TP_BLACK_WHITE, g_img2bit_option, 12, 12);
350 
351 	//------ mContainerView (項目部分はスクロールできるように)
352 
353 	p->ctview = ctv = mContainerViewNew(0, M_WIDGET(p), 0);
354 
355 	ctv->wg.fLayout = MLF_EXPAND_WH;
356 
357 	//内容のコンテナ
358 
359 	ctv->cv.area = ct = mContainerCreate(M_WIDGET(ctv), MCONTAINER_TYPE_VERT, 0, 0, MLF_EXPAND_WH);
360 
361 	p->ctview_area = ct;
362 
363 	mContainerSetPadding_b4(M_CONTAINER(ct), M_MAKE_DW4(1,0,3,4));
364 
365 	//各項目
366 
367 	M_TR_G(TRGROUP_DOCK_BRUSH_VALUE);
368 
369 	_create_widget(p, ct);
370 
371 	return p;
372 }
373 
374 /** (外部から) 半径の値をセット
375  *
376  * @param p  NULL でブラシデータの値のみ変更 */
377 
DockBrushValue_setRadius(DockBrushValue * p,int val)378 void DockBrushValue_setRadius(DockBrushValue *p,int val)
379 {
380 	//指先の場合、/10
381 
382 	if(BrushList_getEditItem()->type == BRUSHITEM_TYPE_FINGER)
383 		val /= 10;
384 
385 	//[!] 範囲外の場合、値が調整されることがある
386 
387 	val = BrushList_updateval_radius(val);
388 
389 	if(p) ValueBar_setPos(p->bar_radius, val);
390 }
391 
392 /** 項目値セット */
393 
DockBrushValue_setValue(DockBrushValue * p)394 void DockBrushValue_setValue(DockBrushValue *p)
395 {
396 	BrushItem *pi = BrushList_getEditItem();
397 	mBool exist;
398 	int i;
399 
400 	//選択アイテムがあるか
401 
402 	exist = (BrushList_getSelItem() != NULL);
403 
404 	//名前
405 
406 	mLabelSetText(p->label_name, (exist)? pi->name: NULL);
407 
408 	//保存ボタン
409 
410 	mWidgetEnable(p->wg_brushsave, (exist && !(pi->flags & BRUSHITEM_F_AUTO_SAVE)));
411 
412 	//------ メイン
413 
414 	//タイプ
415 
416 	mComboBoxSetSel_index(p->cb_type, pi->type);
417 
418 	//半径
419 
420 	_set_radius_bar(p, pi);
421 
422 	//濃度
423 
424 	ValueBar_setPos(p->bar_opacity, pi->opacity);
425 
426 	//塗り
427 
428 	_set_pixelmode_list(p, pi);
429 
430 	//補正
431 
432 	mComboBoxSetSel_index(p->cb_hosei_type, pi->hosei_type);
433 	mComboBoxSetSel_index(p->cb_hosei_str, pi->hosei_strong - 1);
434 
435 	//最小、間隔
436 
437 	ValueBar_setPos(p->bar_min_size, pi->min_size);
438 	ValueBar_setPos(p->bar_min_opacity, pi->min_opacity);
439 	ValueBar_setPos(p->bar_interval, pi->interval);
440 
441 	//ランダム
442 
443 	ValueBar_setPos(p->bar_rand_size, pi->rand_size_min);
444 	ValueBar_setPos(p->bar_rand_pos, pi->rand_pos_range);
445 
446 	//水彩
447 
448 	for(i = 0; i < 3; i++)
449 		ValueBar_setPos(p->bar_water[i], pi->water_param[i]);
450 
451 	//形状
452 
453 	SelMaterial_setName(p->selmat_brush, pi->shape_path);
454 	ValueBar_setPos(p->bar_hard, pi->hardness);
455 	ValueBar_setPos(p->bar_rough, pi->roughness);
456 
457 	//回転
458 
459 	mCheckButtonSetState(p->ck_travelling_dir, pi->flags & BRUSHITEM_F_ROTATE_TRAVELLING_DIR);
460 	ValueBar_setPos(p->bar_angle, pi->rotate_angle);
461 	ValueBar_setPos(p->bar_angle_rand, pi->rotate_rand_w);
462 
463 	//筆圧
464 
465 	mComboBoxSetSel_index(p->cb_press_type, pi->pressure_type);
466 	PressureWidget_setValue(p->pressure_wg, pi->pressure_type, pi->pressure_val);
467 
468 	//ほか
469 
470 	SelMaterial_setName(p->selmat_texture, pi->texture_path);
471 	mCheckButtonSetState(p->ck_antialias, pi->flags & BRUSHITEM_F_ANTIALIAS);
472 	mCheckButtonSetState(p->ck_curve, pi->flags & BRUSHITEM_F_CURVE);
473 
474 	//----- 有効/無効
475 
476 	_enable_by_brushtype(p, pi->type);
477 }
478 
479 
480 //==============================
481 // イベント
482 //==============================
483 
484 
485 /** 水彩プリセット呼び出し */
486 
_waterpreset_call(DockBrushValue * p,int no)487 static void _waterpreset_call(DockBrushValue *p,int no)
488 {
489 	uint32_t v = APP_CONF->water_preset[no];
490 	int i,val;
491 
492 	for(i = 0; i < 3; i++)
493 	{
494 		val = (v >> (i * 10)) & 1023;
495 
496 		ValueBar_setPos(p->bar_water[i], val);
497 
498 		BrushList_updateval_waterparam(i, val);
499 	}
500 }
501 
502 /** 水彩プリセットメニュー実行 */
503 
_runmenu_waterpreset(DockBrushValue * p)504 static void _runmenu_waterpreset(DockBrushValue *p)
505 {
506 	mMenu *menu;
507 	mStr str = MSTR_INIT;
508 	const char *regstr;
509 	mMenuItemInfo *mi;
510 	int i;
511 	mBox box;
512 
513 	M_TR_G(TRGROUP_DOCK_BRUSH_VALUE);
514 
515 	menu = mMenuNew();
516 
517 	//* に登録
518 
519 	regstr = M_TR_T(TRID_WATERPRESET_REGIST);
520 
521 	for(i = 0; i < CONFIG_WATER_PRESET_NUM; i++)
522 	{
523 		mStrSetFormat(&str, regstr, 'A' + i);
524 		mMenuAddText_copy(menu, i, str.buf);
525 	}
526 
527 	mStrFree(&str);
528 
529 	//
530 
531 	mMenuAddSep(menu);
532 	mMenuAddText_static(menu, 100, M_TR_T(TRID_WATERPRESET_RESET));
533 
534 	//
535 
536 	mWidgetGetRootBox(p->wg_watermenu, &box);
537 
538 	mi = mMenuPopup(menu, NULL, box.x, box.y + box.h, 0);
539 	i = (mi)? mi->id: -1;
540 
541 	mMenuDestroy(menu);
542 
543 	//--------
544 
545 	if(i == -1) return;
546 
547 	if(i == 100)
548 		//初期値に戻す
549 		ConfigData_waterPreset_default();
550 	else
551 	{
552 		//登録
553 
554 		APP_CONF->water_preset[i] = ValueBar_getPos(p->bar_water[0])
555 			| (ValueBar_getPos(p->bar_water[1]) << 10)
556 			| (ValueBar_getPos(p->bar_water[2]) << 20);
557 	}
558 }
559 
560 /** 詳細設定 */
561 
_detail_option(DockBrushValue * p)562 static void _detail_option(DockBrushValue *p)
563 {
564 	BrushItem *item = BrushList_getEditItem();
565 
566 	if(BrushDetailDlg_run(p->wg.toplevel, item))
567 	{
568 		BrushList_updateval_detail();
569 
570 		//保存ボタン
571 
572 		mWidgetEnable(p->wg_brushsave,
573 			(BrushList_getSelItem() && !(item->flags & BRUSHITEM_F_AUTO_SAVE)));
574 
575 		//半径バー
576 
577 		_set_radius_bar(p, item);
578 	}
579 }
580 
581 /** イベント */
582 
_event_handle(mWidget * wg,mEvent * ev)583 int _event_handle(mWidget *wg,mEvent *ev)
584 {
585 	DockBrushValue *p = (DockBrushValue *)wg;
586 
587 	if(ev->type == MEVENT_NOTIFY)
588 	{
589 		intptr_t p1,p2;
590 		int id,type;
591 
592 		id = ev->notify.id;
593 		type = ev->notify.type;
594 		p1 = ev->notify.param1;
595 		p2 = ev->notify.param2;
596 
597 		//水彩プリセット呼び出し
598 
599 		if(id >= WID_BTT_WATER_PRESET_TOP && id < WID_BTT_WATER_PRESET_TOP + CONFIG_WATER_PRESET_NUM)
600 		{
601 			_waterpreset_call(p, id - WID_BTT_WATER_PRESET_TOP);
602 			return 1;
603 		}
604 
605 		//
606 
607 		switch(id)
608 		{
609 			//手動保存ボタン
610 			case WID_BTT_SAVE_BRUSH:
611 				BrushList_saveitem_manual();
612 				break;
613 			//詳細設定
614 			case WID_BTT_DETAIL_OPTION:
615 				_detail_option(p);
616 				break;
617 
618 			//タイプ
619 			case TRID_TYPE:
620 				if(type == MCOMBOBOX_N_CHANGESEL)
621 				{
622 					BrushList_updateval_type(p2);
623 
624 					_set_pixelmode_list(p, BrushList_getEditItem());
625 					_set_radius_bar(p, BrushList_getEditItem());
626 					_enable_by_brushtype(p, p2);
627 				}
628 				break;
629 			//半径
630 			case TRID_RADIUS:
631 				if(p2) //値の確定時
632 					BrushList_updateval_radius(p1);
633 				break;
634 			//濃度
635 			case TRID_OPACITY:
636 				if(p2) BrushList_updateval_opacity(p1);
637 				break;
638 			//塗りタイプ
639 			case TRID_PIXELMODE:
640 				if(type == MCOMBOBOX_N_CHANGESEL)
641 					BrushList_updateval_pixelmode(p2);
642 				break;
643 			//補正タイプ
644 			case TRID_HOSEI_TYPE:
645 				if(type == MCOMBOBOX_N_CHANGESEL)
646 					BrushList_updateval_hosei_type(p2);
647 				break;
648 			//補正強さ
649 			case WID_CB_HOSEI_STR:
650 				if(type == MCOMBOBOX_N_CHANGESEL)
651 					BrushList_updateval_hosei_str(p2);
652 				break;
653 
654 			//サイズ最小
655 			case TRID_MIN_SIZE:
656 				if(p2) BrushList_updateval_min_size(p1);
657 				break;
658 			//濃度最小
659 			case TRID_MIN_OPACITY:
660 				if(p2) BrushList_updateval_min_opacity(p1);
661 				break;
662 			//間隔
663 			case TRID_INTERVAL:
664 				if(p2) BrushList_updateval_interval(p1);
665 				break;
666 
667 			//ランダムサイズ
668 			case TRID_RAND_SIZE:
669 				if(p2) BrushList_updateval_random_size(p1);
670 				break;
671 			//ランダム位置
672 			case TRID_RAND_POS:
673 				if(p2) BrushList_updateval_random_pos(p1);
674 				break;
675 
676 			//水彩パラメータ
677 			case TRID_WATER_PARAM1:
678 			case TRID_WATER_PARAM2:
679 			case TRID_WATER_PARAM3:
680 				if(p2)
681 					BrushList_updateval_waterparam(id - TRID_WATER_PARAM1, p1);
682 				break;
683 			//水彩プリセットメニュー
684 			case WID_BTT_WATER_PRESET_MENU:
685 				_runmenu_waterpreset(p);
686 				break;
687 
688 			//形状画像
689 			case WID_SELMAT_BRUSH:
690 				BrushList_updateval_shape_path((const char *)p1);
691 
692 				_enable_by_shapeimage(p);
693 				break;
694 			//硬さ
695 			case TRID_HARD:
696 				if(p2) BrushList_updateval_shape_hard(p1);
697 				break;
698 			//荒さ
699 			case TRID_ROUGH:
700 				if(p2) BrushList_updateval_shape_rough(p1);
701 				break;
702 
703 			//進行方向
704 			case TRID_TRAVELLING_DIR:
705 				BrushList_updateval_travelling_dir();
706 				break;
707 			//角度
708 			case TRID_ANGLE:
709 				if(p2) BrushList_updateval_angle(p1);
710 				break;
711 			//角度ランダム
712 			case TRID_ANGLE_RAND:
713 				if(p2) BrushList_updateval_angle_radom(p1);
714 				break;
715 
716 			//筆圧補正タイプ
717 			case WID_CB_PRESSURE_TYPE:
718 				if(type == MCOMBOBOX_N_CHANGESEL)
719 				{
720 					BrushList_updateval_pressure_type(p2);
721 
722 					PressureWidget_setValue(p->pressure_wg,
723 						BrushList_getEditItem()->pressure_type,
724 						BrushList_getEditItem()->pressure_val);
725 				}
726 				break;
727 			//筆圧補正編集
728 			case WID_PRESSURE_EDIT:
729 				BrushList_updateval_pressure_value(
730 					PressureWidget_getValue(p->pressure_wg));
731 				break;
732 
733 			//テクスチャ画像
734 			case TRID_TEXTURE:
735 				BrushList_updateval_texture_path((const char *)p1);
736 				break;
737 			//アンチエイリアス
738 			case TRID_ANTIALIAS:
739 				BrushList_updateval_antialias();
740 				break;
741 			//曲線補間
742 			case TRID_CURVE:
743 				BrushList_updateval_curve();
744 				break;
745 
746 			//mExpander 展開状態変化
747 			case TRID_HEADER_MAIN:
748 			case TRID_HEADER_MIN:
749 			case TRID_HEADER_RANDOM:
750 			case TRID_HEADER_WATER:
751 			case TRID_HEADER_SHAPE:
752 			case TRID_HEADER_SHAPE_ROTATE:
753 			case TRID_HEADER_PRESSURE:
754 			case TRID_HEADER_OTHER:
755 				APP_CONF->dockbrush_expand_flags ^= ev->notify.widgetFrom->param;
756 
757 				mWidgetReLayout(p->ctview_area);
758 				mContainerViewConstruct(p->ctview);
759 				break;
760 		}
761 	}
762 
763 	return 1;
764 }
765 
766 
767 //==============================
768 // 項目ウィジェット作成
769 //==============================
770 /*
771  * mExpander の param には、展開の ON/OFF 時用に EXPAND_F_* の値を入れておく。
772  */
773 
774 
775 //----------- sub
776 
777 /** mExpander 作成 */
778 
_create_expander(mWidget * parent,int id,int flag)779 static mExpander *_create_expander(mWidget *parent,int id,int flag)
780 {
781 	mExpander *p;
782 
783 	p = mExpanderCreate(parent, id, MEXPANDER_S_HEADER_DARK,
784 			MLF_EXPAND_W, M_MAKE_DW4(0,5,0,0), M_TR_T(id));
785 
786 	p->wg.param = flag;
787 
788 	mExpanderSetPadding_b4(p, M_MAKE_DW4(0,5,0,2));
789 
790 	mExpanderSetExpand(p, APP_CONF->dockbrush_expand_flags & flag);
791 
792 	return p;
793 }
794 
795 /** ラベル+バー作成 (縦) */
796 
_create_label_bar_vert(mExpander * ex,int id,int dig,int min,int max)797 static ValueBar *_create_label_bar_vert(mExpander *ex,int id,int dig,int min,int max)
798 {
799 	mLabelCreate(M_WIDGET(ex), 0, 0, 0, M_TR_T(id));
800 
801 	return ValueBar_new(M_WIDGET(ex), id, MLF_EXPAND_W, dig, min, max, min);
802 }
803 
804 /** ラベル+バー作成 (横) */
805 
_create_label_bar_horz(mWidget * parent,int id,int dig,int min,int max)806 static ValueBar *_create_label_bar_horz(mWidget *parent,int id,int dig,int min,int max)
807 {
808 	mLabelCreate(parent, 0, MLF_MIDDLE, 0, M_TR_T(id));
809 
810 	return ValueBar_new(parent, id, MLF_EXPAND_W | MLF_MIDDLE, dig, min, max, min);
811 }
812 
813 /** ラベル+コンボボックス (横) 作成
814  *
815  * @param groupid 負の値でグループはそのまま、先頭の文字列ID */
816 
_create_label_combo_horz(mWidget * parent,int id,int groupid,int itemnum)817 static mComboBox *_create_label_combo_horz(mWidget *parent,int id,int groupid,int itemnum)
818 {
819 	mComboBox *cb;
820 
821 	mLabelCreate(parent, 0, MLF_MIDDLE, 0, M_TR_T(id));
822 
823 	cb = mComboBoxCreate(parent, id, 0, MLF_EXPAND_W, 0);
824 
825 	if(groupid < 0)
826 		mComboBoxAddTrItems(cb, itemnum, -groupid, 0);
827 	else
828 	{
829 		M_TR_G(groupid);
830 		mComboBoxAddTrItems(cb, itemnum, 0, 0);
831 		M_TR_G(TRGROUP_DOCK_BRUSH_VALUE);
832 	}
833 
834 	return cb;
835 }
836 
837 
838 //------------ 各内容
839 
840 /** メイン項目 */
841 
_create_widget_main(DockBrushValue * p,mWidget * ct_top)842 static void _create_widget_main(DockBrushValue *p,mWidget *ct_top)
843 {
844 	mExpander *pex;
845 	mWidget *ct;
846 	int i;
847 	char m[8];
848 
849 	//mExpander
850 
851 	pex = _create_expander(ct_top, TRID_HEADER_MAIN, EXPAND_F_MAIN);
852 
853 	pex->wg.margin.top = 0;
854 
855 	mContainerSetTypeGrid(M_CONTAINER(pex), 2, 4, 4);
856 
857 	//タイプ
858 
859 	p->cb_type = _create_label_combo_horz(M_WIDGET(pex), TRID_TYPE, -TRID_TYPE_TOP, BRUSHITEM_TYPE_NUM);
860 
861 	//半径
862 
863 	p->bar_radius = _create_label_bar_horz(M_WIDGET(pex), TRID_RADIUS,
864 		1, BRUSHITEM_RADIUS_MIN, BRUSHITEM_RADIUS_MAX);
865 
866 	//濃度
867 
868 	p->bar_opacity = _create_label_bar_horz(M_WIDGET(pex), TRID_OPACITY, 0, 1, 100);
869 
870 	//塗り
871 
872 	p->cb_pixmode = _create_label_combo_horz(M_WIDGET(pex), TRID_PIXELMODE, TRGROUP_PIXELMODE_BRUSH, PIXELMODE_BRUSH_NUM);
873 
874 	//補正
875 
876 	mLabelCreate(M_WIDGET(pex), 0, MLF_MIDDLE, 0, M_TR_T(TRID_HOSEI_TYPE));
877 
878 	ct = mContainerCreate(M_WIDGET(pex), MCONTAINER_TYPE_HORZ, 0, 4, MLF_EXPAND_W);
879 
880 	p->cb_hosei_type = mComboBoxCreate(ct, TRID_HOSEI_TYPE, 0, 0, 0);
881 	p->cb_hosei_str = mComboBoxCreate(ct, WID_CB_HOSEI_STR, 0, MLF_EXPAND_W, 0);
882 
883 	mComboBoxAddTrItems(p->cb_hosei_type, 4, TRID_HOSEITYPE_TOP, 0);
884 	mComboBoxSetWidthAuto(p->cb_hosei_type);
885 
886 	for(i = 1; i <= BRUSHITEM_HOSEI_STRONG_MAX; i++)
887 	{
888 		mIntToStr(m, i);
889 		mComboBoxAddItem(p->cb_hosei_str, m, i);
890 	}
891 }
892 
893 /** 最小&間隔項目 */
894 
_create_widget_min(DockBrushValue * p,mWidget * ct_top)895 static void _create_widget_min(DockBrushValue *p,mWidget *ct_top)
896 {
897 	mExpander *pex;
898 
899 	//mExpander
900 
901 	pex = _create_expander(ct_top, TRID_HEADER_MIN, EXPAND_F_MIN);
902 
903 	pex->ct.sepW = 2;
904 
905 	//サイズ最小
906 
907 	p->bar_min_size = _create_label_bar_vert(pex, TRID_MIN_SIZE, 1, 0, 1000);
908 
909 	//濃度最小
910 
911 	p->bar_min_opacity = _create_label_bar_vert(pex, TRID_MIN_OPACITY, 1, 0, 1000);
912 
913 	//間隔
914 
915 	p->bar_interval = _create_label_bar_vert(pex, TRID_INTERVAL, 2,
916 		BRUSHITEM_INTERVAL_MIN, BRUSHITEM_INTERVAL_MAX);
917 }
918 
919 /** ランダム項目 */
920 
_create_widget_random(DockBrushValue * p,mWidget * ct_top)921 static void _create_widget_random(DockBrushValue *p,mWidget *ct_top)
922 {
923 	mExpander *pex;
924 
925 	//mExpander
926 
927 	pex = _create_expander(ct_top, TRID_HEADER_RANDOM, EXPAND_F_RANDOM);
928 
929 	pex->ct.sepW = 2;
930 
931 	//サイズ最小
932 
933 	p->bar_rand_size = _create_label_bar_vert(pex, TRID_RAND_SIZE, 1, 0, 1000);
934 
935 	//位置
936 
937 	p->bar_rand_pos = _create_label_bar_vert(pex, TRID_RAND_POS, 2, 0, BRUSHITEM_RANDOM_POS_MAX);
938 }
939 
940 /** 水彩項目 */
941 
_create_widget_water(DockBrushValue * p,mWidget * ct_top)942 static void _create_widget_water(DockBrushValue *p,mWidget *ct_top)
943 {
944 	mExpander *pex;
945 	mWidget *ct;
946 	int i;
947 	char m[2] = {0,0};
948 
949 	//mExpander
950 
951 	pex = _create_expander(ct_top, TRID_HEADER_WATER, EXPAND_F_WATER);
952 
953 	pex->ct.sepW = 2;
954 
955 	//プリセット
956 
957 	ct = mContainerCreate(M_WIDGET(pex), MCONTAINER_TYPE_HORZ, 0, 0, 0);
958 
959 	mLabelCreate(ct, 0, MLF_MIDDLE, M_MAKE_DW4(0,0,5,0), M_TR_T(TRID_WATER_PRESET));
960 
961 	for(i = 0; i < CONFIG_WATER_PRESET_NUM; i++)
962 	{
963 		m[0] = 'A' + i;
964 
965 		p->wg_btt_waterpreset[i] = (mWidget *)mButtonCreate(ct, WID_BTT_WATER_PRESET_TOP + i,
966 			MBUTTON_S_REAL_WH, MLF_MIDDLE, 0, m);
967 	}
968 
969 	p->wg_watermenu = (mWidget *)mArrowButtonCreate(ct, WID_BTT_WATER_PRESET_MENU,
970 		MARROWBUTTON_S_DOWN, MLF_MIDDLE, M_MAKE_DW4(8,0,0,0));
971 
972 	//バー
973 
974 	for(i = 0; i < 3; i++)
975 		p->bar_water[i] = _create_label_bar_vert(pex, TRID_WATER_PARAM1 + i, 1, 0, 1000);
976 }
977 
978 /** ブラシ形状項目 */
979 
_create_widget_shape(DockBrushValue * p,mWidget * ct_top)980 static void _create_widget_shape(DockBrushValue *p,mWidget *ct_top)
981 {
982 	mExpander *pex;
983 	mWidget *ct;
984 
985 	//mExpander
986 
987 	pex = _create_expander(ct_top, TRID_HEADER_SHAPE, EXPAND_F_SHAPE);
988 
989 	pex->ct.sepW = 5;
990 
991 	//画像選択
992 
993 	p->selmat_brush = SelMaterial_new(M_WIDGET(pex), WID_SELMAT_BRUSH, SELMATERIAL_TYPE_BRUSH_SHAPE);
994 
995 	//-------
996 
997 	ct = mContainerCreateGrid(M_WIDGET(pex), 2, 4, 6, MLF_EXPAND_W);
998 
999 	//硬さ
1000 
1001 	p->bar_hard = _create_label_bar_horz(ct, TRID_HARD, 0, 0, 100);
1002 
1003 	//荒さ
1004 
1005 	p->bar_rough = _create_label_bar_horz(ct, TRID_ROUGH, 0, 0, 100);
1006 }
1007 
1008 /** 形状回転項目 */
1009 
_create_widget_shape_rotate(DockBrushValue * p,mWidget * ct_top)1010 static void _create_widget_shape_rotate(DockBrushValue *p,mWidget *ct_top)
1011 {
1012 	mExpander *pex;
1013 
1014 	//mExpander
1015 
1016 	pex = _create_expander(ct_top, TRID_HEADER_SHAPE_ROTATE, EXPAND_F_SHAPE_ROTATE);
1017 	pex->ct.sepW = 2;
1018 
1019 	//進行方向
1020 
1021 	p->ck_travelling_dir = mCheckButtonCreate(M_WIDGET(pex), TRID_TRAVELLING_DIR,
1022 		0, 0, 0, M_TR_T(TRID_TRAVELLING_DIR), FALSE);
1023 
1024 	//角度
1025 
1026 	p->bar_angle = _create_label_bar_vert(pex, TRID_ANGLE, 0, 0, 359);
1027 
1028 	//角度ランダム
1029 
1030 	p->bar_angle_rand = _create_label_bar_vert(pex, TRID_ANGLE_RAND, 0, 0, 180);
1031 }
1032 
1033 /** 筆圧項目 */
1034 
_create_widget_pressure(DockBrushValue * p,mWidget * ct_top)1035 static void _create_widget_pressure(DockBrushValue *p,mWidget *ct_top)
1036 {
1037 	mExpander *pex;
1038 
1039 	//mExpander
1040 
1041 	pex = _create_expander(ct_top, TRID_HEADER_PRESSURE, EXPAND_F_PRESSURE);
1042 	pex->ct.sepW = 6;
1043 
1044 	//タイプ
1045 
1046 	p->cb_press_type = mComboBoxCreate(M_WIDGET(pex), WID_CB_PRESSURE_TYPE, 0, MLF_EXPAND_W, 0);
1047 
1048 	mComboBoxAddTrItems(p->cb_press_type, 3, TRID_PRESSURETYPE_TOP, 0);
1049 
1050 	//編集ウィジェット
1051 
1052 	p->pressure_wg = PressureWidget_new(M_WIDGET(pex), WID_PRESSURE_EDIT);
1053 }
1054 
1055 /** ほか項目 */
1056 
_create_widget_other(DockBrushValue * p,mWidget * ct_top)1057 static void _create_widget_other(DockBrushValue *p,mWidget *ct_top)
1058 {
1059 	mExpander *pex;
1060 
1061 	//mExpander
1062 
1063 	pex = _create_expander(ct_top, TRID_HEADER_OTHER, EXPAND_F_OTHER);
1064 	pex->ct.sepW = 3;
1065 
1066 	//テクスチャ
1067 
1068 	mLabelCreate(M_WIDGET(pex), 0, 0, 0, M_TR_T(TRID_TEXTURE));
1069 
1070 	p->selmat_texture = SelMaterial_new(M_WIDGET(pex), TRID_TEXTURE, SELMATERIAL_TYPE_BRUSH_TEXTURE);
1071 
1072 	//アンチエイリアス
1073 
1074 	p->ck_antialias = mCheckButtonCreate(M_WIDGET(pex), TRID_ANTIALIAS,
1075 		0, 0, 0, M_TR_T(TRID_ANTIALIAS), FALSE);
1076 
1077 	//曲線補間
1078 
1079 	p->ck_curve = mCheckButtonCreate(M_WIDGET(pex), TRID_CURVE,
1080 		0, 0, 0, M_TR_T(TRID_CURVE), FALSE);
1081 }
1082 
1083 //------------ main
1084 
1085 /** ウィジェット作成メイン */
1086 
_create_widget(DockBrushValue * p,mWidget * parent)1087 void _create_widget(DockBrushValue *p,mWidget *parent)
1088 {
1089 	_create_widget_main(p, parent);
1090 	_create_widget_min(p, parent);
1091 	_create_widget_random(p, parent);
1092 	_create_widget_water(p, parent);
1093 	_create_widget_shape(p, parent);
1094 	_create_widget_shape_rotate(p, parent);
1095 	_create_widget_pressure(p, parent);
1096 	_create_widget_other(p, parent);
1097 }
1098 
1099