add spinner
authorFelix Domke <tmbinc@elitedvb.net>
Sat, 26 May 2007 11:25:55 +0000 (11:25 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Sat, 26 May 2007 11:25:55 +0000 (11:25 +0000)
lib/gdi/grc.cpp
lib/gdi/grc.h
main/enigma.cpp

index f108a17..e5cab87 100644 (file)
@@ -106,6 +106,9 @@ void *gRC::thread()
 #endif
                if ( rp != wp )
                {
+                               /* make sure the spinner is not displayed when we something is painted */
+                       disableSpinner();
+
                        gOpcode o(queue[rp++]);
                        if ( rp == MAXSIZE )
                                rp=0;
@@ -200,11 +203,11 @@ void gRC::enableSpinner()
                return;
        }
 
-       m_spinner_enabled = 1;
-
        gOpcode o;
        o.opcode = m_spinner_enabled ? gOpcode::incrementSpinner : gOpcode::enableSpinner;
        m_spinner_dc->exec(&o);
+       m_spinner_enabled = 1;
+
 }
 
 void gRC::disableSpinner()
@@ -752,10 +755,13 @@ void gDC::exec(gOpcode *o)
        case gOpcode::flush:
                break;
        case gOpcode::enableSpinner:
+               enableSpinner();
                break;
        case gOpcode::disableSpinner:
+               disableSpinner();
                break;
        case gOpcode::incrementSpinner:
+               incrementSpinner();
                break;
        default:
                eFatal("illegal opcode %d. expect memory leak!", o->opcode);
@@ -774,6 +780,52 @@ gRGB gDC::getRGB(gColor col)
        return m_pixmap->surface->clut.data[col];
 }
 
+void gDC::enableSpinner()
+{
+       ASSERT(m_spinner_saved);
+       
+               /* save the background to restore it later. We need to negative position because we want to blit from the middle of the screen. */
+       m_spinner_saved->blit(*m_pixmap, -m_spinner_pos.topLeft(), gRegion(eRect(ePoint(0, 0), m_spinner_saved->size())), 0);
+       
+       incrementSpinner();
+}
+
+void gDC::disableSpinner()
+{
+       ASSERT(m_spinner_saved);
+
+               /* restore background */
+       m_pixmap->blit(*m_spinner_saved, m_spinner_pos.topLeft(), gRegion(m_spinner_pos), 0);
+}
+
+void gDC::incrementSpinner()
+{
+       ASSERT(m_spinner_saved);
+       
+       static int blub;
+       blub++;
+       
+       int i;
+       
+       for (i = 0; i < 5; ++i)
+       {
+               int x = i * 20 + m_spinner_pos.left();
+               int y = m_spinner_pos.top();
+               
+               int col = ((blub - i) * 30) % 256;
+
+               m_pixmap->fill(eRect(x, y, 10, 10), gRGB(col, col, col));
+       }
+}
+
+void gDC::setSpinner(eRect pos)
+{
+       ASSERT(m_pixmap);
+       ASSERT(m_pixmap->surface);
+       m_spinner_saved = new gPixmap(pos.size(), m_pixmap->surface->bpp);
+       m_spinner_pos = pos;
+}
+
 DEFINE_REF(gDC);
 
 eAutoInitPtr<gRC> init_grc(eAutoInitNumbers::graphic, "gRC");
index 9f32e91..adc1d3b 100644 (file)
@@ -270,6 +270,9 @@ protected:
        std::stack<gRegion> m_clip_stack;
        gRegion m_current_clip;
        
+       ePtr<gPixmap> m_spinner_saved;
+       eRect m_spinner_pos;
+       
 public:
        virtual void exec(gOpcode *opcode);
        gDC(gPixmap *pixmap);
@@ -280,6 +283,11 @@ public:
        gRGB getRGB(gColor col);
        virtual eSize size() { return m_pixmap->size(); }
        virtual int islocked() { return 0; }
+       
+       void enableSpinner();
+       void disableSpinner();
+       void incrementSpinner();
+       void setSpinner(eRect pos);
 };
 
 #endif
index 4af7ca0..45c0c7b 100644 (file)
@@ -190,6 +190,7 @@ int main(int argc, char **argv)
        dsk.setRedrawTask(main);
        dsk_lcd.setRedrawTask(main);
        
+       my_dc->setSpinner(eRect(100, 100, 120, 40));
        gRC::getInstance()->setSpinnerDC(my_dc);
 
        eRCInput::getInstance()->keyEvent.connect(slot(keyEvent));