11/*
2- * Copyright (c) 2020-2026 (https://github.com/phase1geo/Annotator )
2+ * Copyright (c) 2020-2026 (https://github.com/phase1geo/Outliner )
33*
44* This program is free software; you can redistribute it and/or
55* modify it under the terms of the GNU General Public
@@ -37,13 +37,16 @@ public enum ColorPickerType {
3737 public void set_image ( ToggleButton btn ) {
3838 switch ( this ) {
3939 case HCOLOR :
40- btn. icon_name = " format-text-highlight" ;
41- btn. child = null ;
40+ var lbl = new Label ( " <span size=\" large\" >\u 25c9</span>" ) {
41+ use_markup = true
42+ };
43+ btn. child = lbl;
4244 break ;
4345 case FCOLOR : {
44- var lbl = new Label ( " <span size=\" large\" >A</span>" );
45- lbl. use_markup = true ;
46- btn. child = lbl;
46+ var lbl = new Label ( " <span size=\" large\" >A</span>" ) {
47+ use_markup = true
48+ };
49+ btn. child = lbl;
4750 break ;
4851 }
4952 default : assert_not_reached();
@@ -54,56 +57,59 @@ public enum ColorPickerType {
5457
5558public class ColorPicker : Box {
5659
57- private ColorPickerType _type;
58- private ToggleButton _toggle;
59- private ColorChooserWidget _chooser ;
60- private MenuButton _select ;
61- private bool _ignore_active ;
60+ private ColorPickerType _type;
61+ private ToggleButton _toggle;
62+ private Button _select ;
63+ private bool _ignore_active ;
64+ private RGBA _color ;
6265
6366 public signal void color_changed ( RGBA ? color );
6467
65- public ColorPicker ( RGBA init_color , ColorPickerType type ) {
68+ public ColorPicker ( MainWindow win , RGBA init_color , ColorPickerType type ) {
6669
67- _type = type;
70+ Object ( orientation: Orientation . HORIZONTAL );
71+
72+ _type = type;
73+ _color = init_color. copy();
6874
6975 homogeneous = true ;
7076
7177 _toggle = new ToggleButton () {
7278 has_frame = false
7379 };
74- _toggle. toggled. connect( handle_toggle );
7580 _toggle. add_css_class( type. get_css_class() );
81+ _toggle. toggled. connect( handle_toggle );
7682 type. set_image( _toggle );
7783
78- _chooser = new ColorChooserWidget ();
79- _chooser. rgba = init_color;
80-
81- var btn_controller = new GestureClick ();
82- var overlay = new Overlay () {
83- margin_start = 10 ,
84- margin_end = 10 ,
85- margin_top = 10 ,
86- margin_bottom = 10 ,
87- child = _chooser
84+ var chooser = new ColorDialog () {
85+ modal = true ,
86+ with_alpha = true
8887 };
89- overlay. add_controller( btn_controller );
90- btn_controller. pressed. connect((n_press, x, y) = > {
91- handle_chooser();
92- });
9388
94- _select = new MenuButton ( ) {
89+ _select = new Button .from_icon_name( " view-more-symbolic " ) {
9590 has_frame = false
9691 };
97- _select. add_css_class( " color_chooser" );
98-
99- _select. popover = new Popover () {
100- child = overlay
101- };
92+ _select. clicked. connect(() = > {
93+ chooser. choose_rgba. begin( win, _color, null , (obj, res) = > {
94+ try {
95+ var rgba = chooser. choose_rgba. end( res );
96+ if ( rgba != null ) {
97+ _color. free();
98+ _color = rgba. copy();
99+ update_css( rgba );
100+ set_active( true );
101+ color_changed( rgba );
102+ }
103+ } catch ( Error e ) {}
104+ });
105+ });
102106
103107 append( _toggle );
104108 append( _select );
105109
106- update_css( init_color );
110+ add_css_class( Granite . STYLE_CLASS_LINKED );
111+
112+ update_css( _color );
107113
108114 }
109115
@@ -123,8 +129,8 @@ public class ColorPicker : Box {
123129
124130 private void update_css ( RGBA rgba ) {
125131 var provider = new CssProvider ();
126- var color = Utils . color_to_string ( rgba );
127- var css_data = " .%s { background: %s ; }" . printf( _type. get_css_class(), color );
132+ var fg = Granite . contrasting_foreground_color ( rgba );
133+ var css_data = " .%s { background: %s ; color: %s ; }" . printf( _type. get_css_class(), rgba . to_string(), fg . to_string() );
128134 provider. load_from_string( css_data );
129135 StyleContext . add_provider_for_display(
130136 Display . get_default(),
@@ -136,19 +142,11 @@ public class ColorPicker : Box {
136142 private void handle_toggle () {
137143 if ( ! _ignore_active ) {
138144 if ( _toggle. active ) {
139- color_changed( _chooser . rgba );
145+ color_changed( _color );
140146 } else {
141147 color_changed( null );
142148 }
143149 }
144150 }
145151
146- private bool handle_chooser () {
147- update_css( _chooser. rgba );
148- set_active( true );
149- color_changed( _chooser. rgba );
150- _select. popover. popdown();
151- return ( true );
152- }
153-
154152}
0 commit comments