Slider-artige Darstellung eines Vektors



  • Hallo.
    Zur Zeit versuche ich, einen Vektor grafisch darzustellen, der jeweils eine Page enthält. Der Vektor enthält alle Page es. Eine Page ist immer aktiv (wird dargestellt). Jede Page hat einen TabButton, die TabButtons werden in einer Leiste dargestellt. Das ganze ähnelt einem TabControl wie man es aus Windows kennt.

    Ich möchte nun, dass der jeweils aktive Tab den TabButton in die Mitte der Leiste zeichnet. Direkt daneben soll jeweils der "Nachbar" der aktuellen Seite verblasst dargestellt werden. Im Prinzip ist das ja auch ziemlich einfach, nur ergeben sich mir folgende Probleme:

    1. Was mache ich, wenn die Nachbarn unter 0 bzw. über die Größe des Vektors hinausschießen? Genau, ich fange dann jeweils am anderen Ende wieder an. Dennoch kann der Nachbar da erneut rausschießen.
    2. Wie mache ich das ganze auch nutzbar, wenn es nur 1 oder 2 Tabseiten gibt?

    Hier ist mein aktueller Ansatz. Er funktioniert zwar, jedoch gefällt mir die Lösung nicht besonders, und er zeigt Beispielsweise wie folgt an (wenn nur 2 Tabseiten existieren):

    TabA TabA TabA TabB(aktiv) TabA TabB TabB
    

    Es sollte aber so aussehen:

    TabA TabA TabA TabB(aktiv) TabA TabA TabA
    

    Das heißt, der gerade aktive Tab soll nicht aufgelistet werden (als Nachbar).
    Wenn beispielsweise genug Tabs vorhanden sind, um die Liste zu füllen, sollte es so aussehen:

    TabC TabD TabE TabF(aktiv) TabG TabH TabI
    

    Hier ist dann aber auch mein Code:

    int iSize = this->m_vecTabs.size();
    
    // 4 = es sollen jeweils 3 Nachbarn (links und rechts) dargestellt werden
    for (int i = 1; i < 4; i++)
    {
    	// this->m_iTab = aktiver TabIndex
    	int iPrev = this->m_iTab - i;
    
    	if (iPrev < 0)
    	{
    		iPrev = iSize - i;
    
    		if (iPrev < 0)
    		{
    			iPrev = 0;
    		}
    	}
    
    	this->m_vecTabs[iPrev]->drawTab(iX + 335 - i * 100, iY, i);
    
    	int iNext = this->m_iTab + i;
    
    	if (iNext > iSize - 1)
    	{
    		iNext = -1 + i;
    
    		if (iNext > iSize - 1)
    		{
    			iNext = iSize - 1;
    		}
    	}
    
    	this->m_vecTabs[iNext]->drawTab(iX + 335 + i * 100, iY, i);
    }
    
    // aktiven Tab zeichnen
    this->m_pTab->drawTab(iX + 335, iY, 0);
    

    Ich hoffe, dass ist einigermaßen verständlich, was ich bezwecken will. Es geht hier also eigentlich hauptsächlich um das Problem, wie ich das mit dem kleiner-als-0 und größer-als-Vektorgröße hinbekomme.

    Gruß



  • Was ist mit
    2 Tabs
    <0> <0> TabA(active) <TabB> <0>
    "verdunkle" den <0> gegen background.



  • Bei 2 Tabs sollte es so aussehen:

    TabB TabB TabB TabA(aktiv) TabB TabB TabB
    

    Man könnte ja für jede Anzahl ne eigene Funktion schreiben, aber das ist dann eher hingemurkst anstatt dass man es richtig macht.

    Gruß


Anmelden zum Antworten