Jak naprogramovat multibarevnou lištu pro jakékoliv rozlišení

Dnes jsem si dal trochu pauzu od toho předělávání starších Windows Forms programů na WPF, protože mě to ukrutně nebavilo se prodírat kódy, o kterých jsem nevěděl proč jsem je kdysi tak naprogramoval a přemýšlel jsem jak trochu oživit ten svůj web.

Napadlo mě že bych mohl udělat barevnou lištu a tu vložit na každou stránku někde. Naprogramovat celé toto mi trvalo asi 4h.

Prvně co jsem udělal bylo že jsem si to promyslel a došel jsem k závěru, že by byla hloupost abych tuto lištu generoval pro každou stránku zvlášť a proto jsem se rozhodl, že jednu barevnou lištu budou sdílet všechny rozlišení.

Pak jsem začal programovat. Začal jsem s třídou GeneralHelper. Nejtěžší bylo naprogramovat metodu CalculatePercentOfColorBars, která jednorázově při spuštění webu vypočte podle parametrů které jí předáte šířku v % pro jednotlivé barvy a samozřejmě se zde přiřadí každému divu unikátní barva.

U mě to sice může vypadat že to jsou stejné barvy na pohled, ale stačí si je dát pod kapátko a zjistíte že i když se liší třeba jen o “1” tak se liší. A samozřejmě tu je ještě pole colorsColorBar, které obsahuje tolik barev, kolik maximálně zadáte jako druhý argument metodě .

Nezapomeňte, že každá barva tam může být jen jednou!

GeneralHelper.cs

CODEstatic string[] colorsColorBar = new string[] { "#3FB1F0",
...
};
/// <summary>
/// V klici bude rozliseni pro ktere se vztahuje, v hodnote pak pole s cisly, ktere budou vyjadrovat % z dostupne sirky ktere barva zabere
/// </summary>
public static Dictionary<short, byte[]=""> percentOfCountBars = new Dictionary<short, byte[]="">();
/// <summary>
/// V klici bude rozliseni, v hodnote pak barvy ke poli, ktere je na stejnem klici jako zde barvy v slovniku percentOfCountBars
/// </summary>
public static Dictionary<short, List=""></short,><string>> colorsOfBars = new Dictionary<short, List=""></short,><string>>();
    public static void CalculatePercentOfColorBars(short width, int pocet)
    {
    List<string> barvyFinal = new List<string>(pocet);
    List<string> colors = new List<string>(colorsColorBar);
    byte percent = 100;
    byte percent2 = 0;
    int pocet2 = pocet;
    pocet2--;
    byte[] b = new byte[pocet];
    byte i = 1;
    for (; i < 10; i++)
    {
        b[i - 1] = i;
        int indexBarvy = RandomHelper.RandomInt2(0, colors.Count);
        barvyFinal.Add(colors[indexBarvy]);
        colors.RemoveAt(indexBarvy);
        pocet--;
        percent2 += i;
        percent -= i;
    }
    //
    while (percent > 0 && pocet != 0)
    {
        if (percent == 2)
        {
            break;
        }
        byte r = RandomHelper.RandomByte2(1, percent > 9 ? 9 : percent);
        if (r > percent)
        {
            continue;
        }
        b[i - 1] = r;
        int indexBarvy = RandomHelper.RandomInt2(0, colors.Count);
        barvyFinal.Add(colors[indexBarvy]);
        colors.RemoveAt(indexBarvy);
        pocet--;
        percent2 += r;
        percent -= r;
        if (percent < 0)
        {
            break;
        }
        i++;
        if (percent < 10 && percent != 0)
        {
            for (int i2 = 1; i2 < percent + 1; i2++)
            {
                int dex = i - 1;
                if (dex > pocet2)
                {
                    break;
                }
                b[dex] = 1;
                indexBarvy = RandomHelper.RandomInt2(0, colors.Count);
                barvyFinal.Add(colors[indexBarvy]);
                colors.RemoveAt(indexBarvy);
                pocet--;
                if (pocet == 0)
                {
                    break;
                }
                percent2 += 1;
                percent -= 1;
                if (percent < 0)
                {
                    break;
                }
                i++;
            }
        }
    }
    //-Zaverecna korekce
    if (percent2 < 100)
    {
        i++;
        int pomer = 100 - percent2;
        if (b.Length == i + 1)
        {
            b[i] = (byte)pomer;
            int indexBarvy = RandomHelper.RandomInt2(0, colors.Count);
            barvyFinal.Add(colors[indexBarvy]);
        }
        else
        {
            b[0] += (byte)pomer;
        }
    }
    int nt = 0;
    for (int i3 = 0; i3 < b.Length; i3++)
    {
        nt += b[i3];
    }
    if (nt > 100)
    {
        int pomer = nt - 100;
        b[8] -= (byte)pomer;
    }
    byte[] b2 = null;
    int b2l = barvyFinal.Count;
    if (b2l == b.Length)
    {
        b2 = b;
    }
    else
    {
        b2 = new byte[b2l];
        for (int y = 0; y < b2l; y++)
        {
            b2[y] = b[y];
        }
    }
    b2 = CA.JumbleUp<byte>(b2);
    percentOfCountBars.Add(width, b2);
    colorsOfBars.Add(width, barvyFinal);
}

Druhé místo kde musíte něco dopsat je Global.asax. Ten je vždy v rootu vašeho webového projektu – jen tam se bude správně spouštět při inicializaci startu vaší webové aplikace.

Global.asax(metoda Application_Start)

CODEGeneralHelper.CalculatePercentOfColorBars(800, 25);
GeneralHelper.CalculatePercentOfColorBars(840, 30);
//-short.MaxValue se bude pouzivat pokud chci umistit MultiColorLine na celou sirku stranky
GeneralHelper.CalculatePercentOfColorBars(short.MaxValue, 36);

Další místem kde musíte něco naprogramovat je třída MultiColorLine. Tato třída zodpovídá za vygenerování odpovídajícího HTML obsahu s barevnou lištou. Třídu HtmlGenerator vám tu dávat nebudu, odpovídající metody si zvládnete jistě naprogramovat sami:

MultiColorLine.cs

CODEusing System.Collections.Generic;
public class MultiColorLine
{
    public static string GetHtml(short width)
    {
        byte[] sirky = GeneralHelper.
        percentOfCountBars[width];
        List<string> colors = GeneralHelper.colorsOfBars[width];
        HtmlGenerator hg = new HtmlGenerator();
        int bl = sirky.Length - 1;
        for (int i = 0; i < bl; i++)
        {
            hg.WriteTagWith2Attrs("div", "class", "partColorBar", "style", "width:" + sirky[i] + "%;background-color:" + colors[i]);
            hg.TerminateTag("div");
        }
        hg.WriteTagWith2Attrs("div", "class", "partColorBar", "style", "width:" + sirky[bl] + "%;background-color:" + colors[bl] + ";float:right;");
        hg.TerminateTag("div");
        return hg.ToString();
    }
} </string>

Předposlední místo je pak samotná (Master)Page ve které zavoláte . Ve stránce na odpovídající místo vložte tento div a případně naslytujte podle vlastního uvážení:

Neco.Master

CODE<div id="divBarevnaLista" runat="server"></div>

Ve code behindu pak dejte následující kód(pouze si upravte jak chcete mít lištu širokou v 1. argumentu), který vytvoří HTML kód a vloží vám jej jako vnitřek divu.

Neco.Master.cs

CODEdivBarevnaLista.InnerHtml = MultiColorLine.GetHtml(800);

Ve stránce, případně externím CSS pak musíte mít i toto CSS:

Neco.css

CODE.partColorBar {
	height: 5px;
	max-height: 5px;
	min-height: 5px;
	display: inline-block;
	padding: 0;
	margin: 0;
	float: left;
}

Posledním kódem který vám tu dám jsou ty další metody které jsem volal, abyste nemuseli tápat, jak je implementovat:

CODEinternal static T[] JumbleUp<T>(T[] b)
{
    int bl = b.Length;
    for (int i = 0; i < bl; ++i)
    {
        int index1 = (RandomHelper.RandomInt() % bl);
        int index2 = (RandomHelper.RandomInt() % bl);
        T temp = b[index1];
        b[index1] = b[index2];
        b[index2] = temp;
    }
    return b;
    }
    public static class RandomHelper
    {
    static Random rnd = new Random();
    internal static int RandomInt2(int od, int to)
    {
        return rnd.Next(od, to);
    }
    internal static byte RandomByte2(int od, int to)
    {
        return (byte)rnd.Next(od, to);
    }
} 

Výsledek?


Default.aspx s barevnou listou


BibleServer s barevnou listou

Leave a Reply

Your email address will not be published. Required fields are marked *