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