colorpicker rework, cin.desktop+shortcuts+license updates, edit titlebar colors+auto...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / gwindowgui.C
index ce888faf6038343a5ec2ce5d5098c4781eb54706..81520f018ac0fe1e23ce3eebb2c48c2a2a86ed47 100644 (file)
@@ -49,24 +49,12 @@ GWindowGUI::GWindowGUI(MWindow *mwindow, int w, int h)
        w, h, w, h, 0, 0, 1)
 {
        this->mwindow = mwindow;
-       color_thread = 0;
        camera_xyz = 0;
        projector_xyz = 0;
 }
 
 GWindowGUI::~GWindowGUI()
 {
-       delete color_thread;
-}
-
-void GWindowGUI::start_color_thread(GWindowColorButton *color_button)
-{
-       unlock_window();
-       delete color_thread;
-       color_thread = new GWindowColorThread(this, color_button);
-       int color = auto_colors[color_button->auto_toggle->info->ref];
-       color_thread->start(color);
-       lock_window("GWindowGUI::start_color_thread");
 }
 
 const char *GWindowGUI::non_auto_text[NON_AUTOMATION_TOTAL] =
@@ -197,103 +185,39 @@ void GWindowGUI::calculate_extents(BC_WindowBase *gui, int *w, int *h)
        *w += 20;
 }
 
-GWindowColorButton::GWindowColorButton(GWindowToggle *auto_toggle, int x, int y, int w)
- : BC_Button(x, y, w, vframes)
+GWindowColorButton::GWindowColorButton(GWindowToggle *auto_toggle,
+               int x, int y, int w, int color)
+ : ColorCircleButton(auto_toggle->caption, x, y, w, w, color, -1, 1)
 {
        this->auto_toggle = auto_toggle;
-       this->color = 0;
-       for( int i=0; i<3; ++i ) {
-               vframes[i] = new VFrame(w, w, BC_RGBA8888);
-               vframes[i]->clear_frame();
-       }
+       this->color = color;
 }
 
 GWindowColorButton::~GWindowColorButton()
 {
-       for( int i=0; i<3; ++i )
-               delete vframes[i];
 }
 
-void GWindowColorButton::set_color(int color)
+int GWindowColorButton::handle_new_color(int color, int alpha)
 {
        this->color = color;
-       int r = (color>>16) & 0xff;
-       int g = (color>>8) & 0xff;
-       int b = (color>>0) & 0xff;
-       for( int i=0; i<3; ++i ) {
-               VFrame *vframe = vframes[i];
-               int ww = vframe->get_w(), hh = vframe->get_h();
-               int cx = (ww+1)/2, cy = hh/2;
-               double cc = (cx*cx + cy*cy) / 4.;
-               uint8_t *bp = vframe->get_data(), *dp = bp;
-               uint8_t *ep = dp + vframe->get_data_size();
-               int rr = r, gg = g, bb = b;
-               int bpl = vframe->get_bytes_per_line();
-               switch( i ) {
-               case BUTTON_UP:
-                       break;
-               case BUTTON_UPHI:
-                       if( (rr+=48) > 0xff ) rr = 0xff;
-                       if( (gg+=48) > 0xff ) gg = 0xff;
-                       if( (bb+=48) > 0xff ) bb = 0xff;
-                       break;
-               case BUTTON_DOWNHI:
-                       if( (rr-=48) < 0x00 ) rr = 0x00;
-                       if( (gg-=48) < 0x00 ) gg = 0x00;
-                       if( (bb-=48) < 0x00 ) bb = 0x00;
-                       break;
-               }
-               while( dp < ep ) {
-                       int yy = (dp-bp) / bpl, xx = ((dp-bp) % bpl) >> 2;
-                       int dy = cy - yy, dx = cx - xx;
-                       double s = dx*dx + dy*dy - cc;
-                       double ss = s < 0 ? 1 : s >= cc ? 0 : 1 - s/cc;
-                       int aa = ss * 0xff;
-                       *dp++ = rr; *dp++ = gg; *dp++ = bb; *dp++ = aa;
-               }
-       }
-       set_images(vframes);
-}
-
-void GWindowColorButton::update_gui(int color)
-{
-       set_color(color);
-       draw_face();
-}
-
-GWindowColorThread::GWindowColorThread(GWindowGUI *gui, GWindowColorButton *color_button)
- : ColorPicker(0, color_button->auto_toggle->caption)
-{
-       this->gui = gui;
-       this->color_button = color_button;
-       this->color = 0;
-       color_update = new GWindowColorUpdate(this);
-}
-
-GWindowColorThread::~GWindowColorThread()
-{
-       delete color_update;
-}
-
-void GWindowColorThread::start(int color)
-{
-       start_window(color, 0, 1);
-       color_update->start();
+       color_thread->update_lock->unlock();
+       return 1;
 }
 
-void GWindowColorThread::handle_done_event(int result)
+void GWindowColorButton::handle_done_event(int result)
 {
-       color_update->stop();
-       int ref = color_button->auto_toggle->info->ref;
+       ColorCircleButton::handle_done_event(result);
+       int ref = auto_toggle->info->ref;
+       GWindowGUI *gui = auto_toggle->gui;
        gui->lock_window("GWindowColorThread::handle_done_event");
        if( !result ) {
                GWindowGUI::auto_colors[ref] = color;
-               color_button->auto_toggle->update_gui(color);
+               auto_toggle->update_gui(color);
                gui->save_defaults();
        }
        else {
                color = GWindowGUI::auto_colors[ref];
-               color_button->update_gui(color);
+               update_gui(color);
        }
        gui->unlock_window();
        MWindowGUI *mwindow_gui = gui->mwindow->gui;
@@ -302,67 +226,6 @@ void GWindowColorThread::handle_done_event(int result)
        mwindow_gui->unlock_window();
 }
 
-int GWindowColorThread::handle_new_color(int color, int alpha)
-{
-       this->color = color;
-       color_update->update_lock->unlock();
-       return 1;
-}
-
-void GWindowColorThread::update_gui()
-{
-       gui->lock_window("GWindowColorThread::update_gui");
-       color_button->update_gui(color);
-       gui->unlock_window();
-}
-
-GWindowColorUpdate::GWindowColorUpdate(GWindowColorThread *color_thread)
- : Thread(1, 0, 0)
-{
-       this->color_thread = color_thread;
-       this->update_lock = new Condition(0,"GWindowColorUpdate::update_lock");
-       done = 1;
-}
-
-GWindowColorUpdate::~GWindowColorUpdate()
-{
-       stop();
-       delete update_lock;
-}
-
-void GWindowColorUpdate::start()
-{
-       if( done ) {
-               done = 0;
-               Thread::start();
-       }
-}
-
-void GWindowColorUpdate::stop()
-{
-       if( !done ) {
-               done = 1;
-               update_lock->unlock();
-               join();
-       }
-}
-
-void GWindowColorUpdate::run()
-{
-       while( !done ) {
-               update_lock->lock("GWindowColorUpdate::run");
-               if( done ) break;
-               color_thread->update_gui();
-       }
-}
-
-
-int GWindowColorButton::handle_event()
-{
-       GWindowGUI *gui = auto_toggle->gui;
-       gui->start_color_thread(this);
-       return 1;
-}
 
 void GWindowGUI::create_objects()
 {
@@ -393,10 +256,9 @@ void GWindowGUI::create_objects()
                        if( !vframe ) {
                                int wh = toggle->get_h() - 4;
                                GWindowColorButton *color_button =
-                                       new GWindowColorButton(toggle, get_w()-wh-10, y+2, wh);
+                                       new GWindowColorButton(toggle, get_w()-wh-10, y+2, wh, color);
                                add_tool(color_button);
-                               color_button->set_color(color);
-                               color_button->draw_face();
+                               color_button->create_objects();
                        }
                        else
                                draw_vframe(vframe, get_w()-vframe->get_w()-10, y);
@@ -480,7 +342,6 @@ int GWindowGUI::translation_event()
 
 int GWindowGUI::close_event()
 {
-       delete color_thread;  color_thread = 0;
        hide_window();
        mwindow->session->show_gwindow = 0;
        unlock_window();