It is a very long code, this css setup is part of very big class
that creates the View of all game.

I will post part of the class, hoping this will not be a trouble:

class View : MainWindow
{
	private {
		string[] tokenImages;
		/*TODO: The reference to board information MUST be readonly otherwise we will violate the MVC pattern. 
		Only the controller and the engine should alter the game logic!*/
		/*immutable*/ Board board;
		Tid gui;
		Tid eListener;
		Tid chatSenderThread;
		Tid nTalker;
		string myPlayerName;
		
		Builder b;
		Grid grid;
		//Frame[numBoxes] tokenBoxes;
		//Box[numBoxes] tokenBoxes;
		boardBox[numBoxes] tokenBoxes;
		Image[string] token;
		Image[2] uiDices;
		PlayersList listModel;
		TreeView lstPlayers;
		TreeViewColumn icon;
		TreeViewColumn name;
		TreeViewColumn address;
		Button dice;
		Button jwt;
		Button sintex;
		Button shares;
		SpinButton nDices;
		Label msgBox;
		Label upCard;
		Label boxInfo;
		Label nProducts;
		Label nRawMat;
		Label nEnergy;
		Label nComputer;
		Label nJwt;
		Label nSintex;
		Label nMilano;
		Label nCash;
		Label nCredito;
		Label nRoma;
		EventBox msgBoxBg;
		EventBox upCardBg;
		EventBox boxInfoBg;
		TextView chat;
		Entry msgInputBox;
		Button sendMessage;
		Window w;
	}
	
	this(ref Board board, string myPlayerName) {
		this.board = /*TODO: cast(immutable)*/board;
		version(gtk) {
			super("Manager");
			tokenImages = ["blueToken.png", "redToken.png", "violetToken.png", "yellowToken.png", "greenToken.png", "cyanToken.png"];
			
			this.myPlayerName = myPlayerName;
			
			//assign token images to all players and refresh their status info
			int i;
			foreach(name, player; board.players)
				token[name] = new Image(gladePath ~ tokenImages[i++]);
			
			//Building the model for lstPlayers TreeView
			listModel = new PlayersList(true);
			foreach(player; board.players)
				listModel.addPlayer(player.name, player.addressPort, token[player.name]);
				
			b = new Builder();
			b.addFromFile(gladePath ~ "board.glade");
			
			setupBoard();
			setupPanel();
			setupStyle();
			
			renderAllPlayers(true);
			
			//Setting all objects event handlers
			dice.addOnClicked(&actionThrowDices);
			jwt.addOnClicked(&actionUseJwt);
			sintex.addOnClicked(&actionUseSintex);
			sendMessage.addOnClicked(&actionSendMessage!Button);
			msgInputBox.addOnActivate(&actionSendMessage!Entry);
			lstPlayers.addOnRowActivated(&actionSelectPlayer);
			nDices.addOnValueChanged(&actionSetDiceNum);
			shares.addOnClicked(&actionShowShares);
			
			w.showAll();
			
			gui = spawn(&guiThreadAdapter, cast(shared)this);
			register("guiThread", gui);
			eListener = locate("eListenerThread");
			chatSenderThread = locate("chatSenderThread");
			nTalker = locate("netTalker");
			//Lets wait for a moment that spawn starts the thread before idle a job otherwise we will get a bastard "Segmentation fault"
			Thread.sleep(dur!("seconds")(2));
			startGuiRequestService();
		}
	}
	
	//Gui thread idle service to execute incoming requests for graphics manipulation
	bool guiEngine() {
		//writeln("Gui scheduler: cpu acquired!");
		/*Tid nTalker = locate("netTalker");
		Tid eListenerThread = locate("eListenerThread");
		Tid chatSenderThread = locate("chatSenderThread");*/
		receiveTimeout(dur!("msecs")( guiSchedulerTimeout ),
				//Gui requests service (UIST: user interface service for threads)
				(int request, string data, Tid thread) {
					switch (request) {
						case UI.renderDices :
							int[] dices = deserialize!(int[])(data);
							renderDices(dices);
						break;
						case UI.renderMessage :
							chatMessage(data);
						break;
						case UI.printMessage :
							printMessage(data);
						break;
						case UI.enableUserButtons :
							enableUserButtons();
						break;
						case UI.enableDiceButton :
							enableDiceButton();
						break;
						case UI.enableServiceButtons :
							enableServiceButtons();
						break;
						case UI.disableUserButtons :
							disableUserButtons();
						break;
						case UI.disableDiceButton :
							disableDiceButton();
						break;
						case UI.disableServiceButtons :
							disableServiceButtons();
						break;
						case UI.printConjuncture :
							printConjuncture(data);
						break;
						case UI.showPopupMessage :
							PopupBox.information(data, "Information");
						break;
						case UI.refreshPlayerStatus :
							refreshStatus(board.players[data]);
						break;
						case UI.showPopupAskPath :
							bool input = SpecialPopupBox.yesNo(data, "Scegli", "Produzione", "Distribuzione");
							thread.send(input);
						break;
						case UI.showPopupAskLoan, UI.showPopupAskSellShare, UI.showAskServiceToken :
							bool input = PopupBox.yesNo(data, "Scegli");
							thread.send(input);
						break;
						case UI.showAskHowManyServiceTokens :
							uint input = to!uint(createGtkApp!AskNOfTokens(gladePath ~ "askNTokens.glade")[0]);
							thread.send(input);						
						break;
						default:
							writefln("guiEngine: gui request <%s> not handled", request);
					}
				},
				//Update last updated player (special system event)
				(shared Player playerToMove, Tid thread) {
					writeln("Received updatePlayer request");
					Player player = cast(Player)playerToMove;
					renderPlayer(player.name);
					writeln(player.pos());
				},
				(Variant data) {
					writeln("GuiThread: Signal not handled, received: ", data);
				}
		);
		//writeln("Gui scheduler: cpu released!");
		return true;
	}
	
	//Gui thread
	void guiThread() {
		string[] argv = null;
		Main.init(argv);
		Main.run();
	}
	
	private {
		
		//Idles the gtk event loop with the guiEngine service
		void startGuiRequestService() {
			auto service = new Idle(&guiEngine, GPriority.DEFAULT_IDLE, true);
			writeln("DEBUG");
		}
		
		void setupBoard() {
			w = cast(Window)b.getObject("window1");
			grid = cast(Grid)b.getObject("grid");
			msgBox = cast(Label)b.getObject("msgBox");
			msgBoxBg = cast(EventBox)b.getObject("msgBoxBg");
			upCardBg = cast(EventBox)b.getObject("upCardBg");
			boxInfoBg = cast(EventBox)b.getObject("boxInfoBg");
			msgBox.setLineWrap(true);
			upCard = cast(Label)b.getObject("upCard");
			upCard.setLineWrap(true);
			boxInfo = cast(Label)b.getObject("boxInfo");
			
			//Initialize and attach gtk boxes to the grid
			uint left, top;
			foreach (j, ref tokenBox; tokenBoxes) {
				//tokenBox = new Box(GtkOrientation.HORIZONTAL, 0);
				//tokenBox = new Frame(to!string(j + 1));
				tokenBox = boardBox(new Frame(to!string(j + 1)), 
						new Box(GtkOrientation.HORIZONTAL, 0));
				if (j == 0) {
					left = 7;
					top = 12;
				}
				else if (j <= 7)
					--left;
				else if (j <= 19)
					--top;
				else if (j <= choosePath - 1)
					++left;
				else if (j <= 37) {
					left = 7;
					++top;
				}
				else if (j == 38) {
					left = 8;
					top = 1;
				}
				else if (j <= 48)
					++top;
				//grid.attach(new Image(gladePath ~ "boxes/" ~ to!string(j + 1) ~ ".png"), left, top, 1, 1);
				auto boxImage = new Image();
				boxImage.setHalign(GtkAlign.CENTER);
				if (j == 0) {
					tokenBox.frame.setName(to!string(j + 1));
					/*boxImage.setFromFile(gladePath ~ "boxes/" ~ to!string(j + 1) ~ ".png");
					grid.attach(boxImage, left, top, 1, 1);*/
				}
				else
					grid.attach(new Image(gladePath ~ "empty.png"), left, top, 1, 1);
					
				//Conjuncture boxes n.1 and n.27 width is larger (2)	
				uint width = 1;
				if ((j == 0) || (j == (choosePath - 1)))
					width = 2;
				grid.attach(tokenBox.frame, left, top, width, 1);
			}
		}
		
		void setupPanel() {
			//Setup TreeView
			lstPlayers = cast(TreeView)b.getObject("lstPlayers");
			lstPlayers.getSelection().setMode(GtkSelectionMode.BROWSE);
			lstPlayers.setFixedHeightMode(false);
			lstPlayers.setModel(listModel);
			lstPlayers.getSelection().selectPath(new TreePath("0"));
			icon = new TreeViewColumn("Pedina", new CellRendererPixbuf(), "pixbuf", 0);
			lstPlayers.appendColumn(icon);
			name = new TreeViewColumn("Nome", new CellRendererText(), "text", 1);
			lstPlayers.appendColumn(name);
			address = new TreeViewColumn("Indirizzo", new CellRendererText(), "text", 2);
			lstPlayers.appendColumn(address);
			//Panel buttons
			dice = cast(Button)b.getObject("btnDice");
			jwt = cast(Button)b.getObject("btnJwt");
			sintex = cast(Button)b.getObject("btnSintex");
			shares = cast(Button)b.getObject("btnShares");
			//Panel status info
			nProducts = cast(Label)b.getObject("nProducts");
			nDices = cast(SpinButton)b.getObject("nDices");
			nRawMat = cast(Label)b.getObject("nRawMat");
			nEnergy = cast(Label)b.getObject("nEnergy");
			nComputer = cast(Label)b.getObject("nComputer");
			nJwt = cast(Label)b.getObject("nJwt");
			nSintex = cast(Label)b.getObject("nSintex");
			nMilano = cast(Label)b.getObject("nMilano");
			nCash = cast(Label)b.getObject("nCash");
			nCredito = cast(Label)b.getObject("nCredito");
			nRoma = cast(Label)b.getObject("nRoma");
			//Setup Chat
			chat = cast(TextView)b.getObject("chat");
			msgInputBox = cast(Entry)b.getObject("msgInputBox");
			sendMessage = cast(Button)b.getObject("sendMessage");
			//On default we show the client's player info
			refreshStatus(board.players[myPlayerName]);
		}
		
		void setupStyle() {
			//The global context css seems to work only for last versions of gtk so i will not use it for now
			auto style = new CssProvider();
			style.loadFromPath(gladePath ~ "grid.css");
			Screen globalScreen = Display.getDefault().getDefaultScreen();
			writeln("CSS DEBUG: ", style);
			StyleContext.addProviderForScreen(globalScreen, style, GTK_STYLE_PROVIDER_PRIORITY_USER);

		}
	}
}