Ticket #1701: colorControl.diff

File colorControl.diff, 6.7 KB (added by aldeck, 12 months ago)
  • src/kits/interface/ColorControl.cpp

     
    2323 
    2424static const uint32 kMsgColorEntered = 'ccol'; 
    2525static const uint32 kMinCellSize = 6; 
     26static const float kSelectorPenSize = 2.0f; 
     27static const float kSelectorSize = 4.0f; 
     28static const float kSelectorHSpacing = 2.0f; 
    2629 
    27  
    2830BColorControl::BColorControl(BPoint leftTop, color_control_layout layout, 
    2931        float cellSize, const char *name, BMessage *message, 
    3032        bool bufferedDrawing) 
     
    222224        c2.blue = (value & 0x0000FF00) >> 8; 
    223225        char string[4]; 
    224226 
    225         // values for calculating the selector rectangles for invalidation 
    226         // analogous to selector drawing in _DrawColorArea 
    227         float rampXGradient = (ceil(fColumns * fCellSize) - 4 - 7)  / 255; 
    228         float rampSize = (Bounds().bottom - 2) / 4.0; 
    229         float x, y; 
     227        float invalidateRadius = kSelectorSize/2 + kSelectorPenSize; 
     228        BPoint p; 
    230229 
    231230        if (c1.red != c2.red) { 
    232231                sprintf(string, "%d", c2.red); 
    233232                fRedText->SetText(string); 
    234233                 
    235                 y = rampSize * 1.5; 
    236                 x = 2 + c1.red * rampXGradient; 
    237                 Invalidate(BRect(x - 2, y - 2, x + 6, y + 6)); 
    238                 x = 2 + c2.red * rampXGradient; 
    239                 Invalidate(BRect(x - 2, y - 2, x + 6, y + 6)); 
     234                p = _SelectorPosition(fRampRects[1], c1.red); 
     235                Invalidate(BRect(p.x - invalidateRadius, p.y - invalidateRadius, 
     236                         p.x + invalidateRadius, p.y + invalidateRadius));       
     237                          
     238                p = _SelectorPosition(fRampRects[1], c2.red); 
     239                Invalidate(BRect(p.x - invalidateRadius, p.y - invalidateRadius, 
     240                         p.x + invalidateRadius, p.y + invalidateRadius));       
    240241        } 
    241242 
    242243        if (c1.green != c2.green) { 
    243244                sprintf(string, "%d", c2.green); 
    244245                fGreenText->SetText(string); 
    245246 
    246                 y = rampSize * 2.5;              
    247                 x = 2 + c1.green * rampXGradient; 
    248                 Invalidate(BRect(x - 2, y - 2, x + 6, y + 6)); 
    249                 x = 2 + c2.green * rampXGradient; 
    250                 Invalidate(BRect(x - 2, y - 2, x + 6, y + 6)); 
     247                p = _SelectorPosition(fRampRects[2], c1.green); 
     248                Invalidate(BRect(p.x - invalidateRadius, p.y - invalidateRadius, 
     249                         p.x + invalidateRadius, p.y + invalidateRadius)); 
     250                                 
     251                p = _SelectorPosition(fRampRects[2], c2.green); 
     252                Invalidate(BRect(p.x - invalidateRadius, p.y - invalidateRadius, 
     253                         p.x + invalidateRadius, p.y + invalidateRadius));               
    251254        } 
    252255        if (c1.blue != c2.blue) { 
    253256                sprintf(string, "%d", c2.blue); 
    254257                fBlueText->SetText(string); 
    255258                 
    256                 y = rampSize * 3.5; 
    257                 x = 2 + c1.blue * rampXGradient; 
    258                 Invalidate(BRect(x - 2, y - 2, x + 6, y + 6)); 
    259                 x = 2 + c2.blue * rampXGradient; 
    260                 Invalidate(BRect(x - 2, y - 2, x + 6, y + 6)); 
     259                p = _SelectorPosition(fRampRects[3], c1.blue); 
     260                Invalidate(BRect(p.x - invalidateRadius, p.y - invalidateRadius, 
     261                         p.x + invalidateRadius, p.y + invalidateRadius)); 
     262                                 
     263                p = _SelectorPosition(fRampRects[3], c2.blue); 
     264                Invalidate(BRect(p.x - invalidateRadius, p.y - invalidateRadius, 
     265                         p.x + invalidateRadius, p.y + invalidateRadius));                               
    261266        } 
    262267 
    263268        BControl::SetValueNoUpdate(value); 
     
    397402        float rampSize = rampRect.Height() / 4.0; 
    398403 
    399404        rampRect.bottom = rampRect.top + rampSize; 
    400  
     405        fRampRects[0] = rampRect; 
    401406        _ColorRamp(rampRect, target, white, 0, false); 
    402407 
    403408        rampRect.OffsetBy(0, rampSize); 
     409        fRampRects[1] = rampRect; 
    404410        _ColorRamp(rampRect, target, red, 0, false); 
    405411 
    406         rampRect.OffsetBy(0,rampSize); 
     412        rampRect.OffsetBy(0, rampSize); 
     413        fRampRects[2] = rampRect; 
    407414        _ColorRamp(rampRect, target, green, 0, false); 
    408415 
    409416        rampRect.OffsetBy(0, rampSize); 
     417        fRampRects[3] = rampRect; 
    410418        _ColorRamp(rampRect, target, blue, 0, false); 
    411419 
    412420        // Selectors 
    413421        rgb_color color = ValueAsColor(); 
    414         float x, y = rampSize * 1.5; 
    415  
     422         
    416423        target->SetDrawingMode(B_OP_OVER); 
    417         target->SetPenSize(2.0f); 
    418  
    419         x = rect.left + color.red * (rect.Width() - 7) / 255; 
     424        target->SetPenSize(kSelectorPenSize); 
     425         
    420426        target->SetHighColor(255, 255, 255); 
    421         target->StrokeEllipse(BRect(x, y, x + 4.0f, y + 4.0f)); 
     427        target->StrokeEllipse(_SelectorPosition(fRampRects[1], color.red), 
     428                 kSelectorSize / 2, kSelectorSize / 2); 
    422429 
    423         y += rampSize; 
    424  
    425         x = rect.left + color.green * (rect.Width() - 7) / 255; 
    426430        target->SetHighColor(255, 255, 255); 
    427         target->StrokeEllipse(BRect(x, y, x + 4.0f, y + 4.0f)); 
     431        target->StrokeEllipse(_SelectorPosition(fRampRects[2], color.green), 
     432                 kSelectorSize / 2, kSelectorSize / 2); 
    428433 
    429         y += rampSize; 
    430  
    431         x = rect.left + color.blue * (rect.Width() - 7) / 255; 
    432434        target->SetHighColor(255, 255, 255); 
    433         target->StrokeEllipse(BRect(x, y, x + 4.0f, y + 4.0f)); 
     435        target->StrokeEllipse(_SelectorPosition(fRampRects[3], color.blue), 
     436                 kSelectorSize / 2, kSelectorSize / 2); 
    434437 
    435438        target->SetPenSize(1.0f); 
    436439        target->SetDrawingMode(B_OP_COPY); 
     
    462465} 
    463466 
    464467 
     468BPoint 
     469BColorControl::_SelectorPosition(const BRect& rampRect, uint8 shade) const 
     470{ 
     471        float radius = kSelectorSize / 2 + kSelectorPenSize / 2; 
     472         
     473        return BPoint(rampRect.left + kSelectorHSpacing + radius +  
     474                shade * (rampRect.Width() - 2 * (kSelectorHSpacing + radius)) / 255, 
     475                rampRect.top + rampRect.Height() / 2); 
     476} 
     477 
     478 
    465479void 
    466480BColorControl::_UpdateOffscreen(BRect update) 
    467481{ 
     
    572586 
    573587        rgb_color color = ValueAsColor(); 
    574588 
    575         float rampsize = rect.bottom / 4; 
    576  
    577589        uint8 shade = (unsigned char)max_c(0, 
    578                 min_c((point.x - 2) * 255 / (rect.Width() - 4.0f), 255)); 
    579  
    580         if (point.y - 2 < rampsize) { 
     590                 min_c((point.x - fRampRects[0].left) * 255 / fRampRects[0].Width(), 255)); 
     591         
     592        if (fRampRects[0].Contains(point)) { 
    581593                color.red = color.green = color.blue = shade; 
    582594                fFocusedComponent = 1; 
    583         } else if (point.y - 2 < (rampsize * 2)) { 
     595        } else if (fRampRects[1].Contains(point)) { 
    584596                color.red = shade; 
    585597                fFocusedComponent = 2; 
    586         } else if (point.y - 2 < (rampsize * 3)) { 
     598        } else if (fRampRects[2].Contains(point)) { 
    587599                color.green = shade; 
    588600                fFocusedComponent = 3; 
    589         } else { 
     601        } else if (fRampRects[3].Contains(point)){ 
    590602                color.blue = shade; 
    591603                fFocusedComponent = 4; 
    592604        } 
     
    609621         
    610622        rgb_color color = ValueAsColor(); 
    611623 
    612         BRect rect(0.0f, 0.0f, fColumns * fCellSize, Bounds().bottom); 
    613  
    614624        uint8 shade = (unsigned char)max_c(0, 
    615                 min_c((point.x - 2) * 255 / (rect.Width() - 4.0f), 255)); 
    616  
     625                min_c((point.x - fRampRects[0].left) * 255 / fRampRects[0].Width(), 255)); 
     626         
    617627        switch (fFocusedComponent) { 
    618628                case 1: 
    619629                        color.red = color.green = color.blue = shade; 
  • headers/os/interface/ColorControl.h

     
    9292                void                            _ColorRamp(BRect rect, BView* target, 
    9393                                                                rgb_color baseColor, int16 flag, 
    9494                                                                bool focused); 
     95                BPoint                          _SelectorPosition(const BRect& rampRect, uint8 shade) const; 
    9596 
    9697        private: 
     98                BRect                           fRampRects[4]; 
     99                 
    97100                float                           fCellSize; 
    98101                int32                           fRows; 
    99102                int32                           fColumns;