PickLaserMountForm::PickLaserMountForm(FormController *controller, StationShipEquipmentForm *equipForm, Equip::Type equipType, bool doFit) :
    FaceForm(controller),
    m_equipForm(equipForm),
    m_equipType(equipType),
    m_doFit(doFit)
{
    Gui::VBox *layoutBox = new Gui::VBox();
    layoutBox->SetSpacing(10.0f);

    if (m_doFit)
        layoutBox->PackEnd(new Gui::Label(Lang::FIT_TO_WHICH_MOUNT));
    else
        layoutBox->PackEnd(new Gui::Label(Lang::REMOVE_FROM_WHICH_MOUNT));

    Equip::Slot slot = Equip::types[m_equipType].slot;

    for (int i=0; i<ShipType::GUNMOUNT_MAX; i++) {
        if (m_doFit && (Pi::player->m_equipment.Get(slot, i) != Equip::NONE)) continue;
        if ((!m_doFit) && (Pi::player->m_equipment.Get(slot, i) != m_equipType)) continue;

        Gui::HBox *buttonBox = new Gui::HBox();
        buttonBox->SetSpacing(5.0f);

        Gui::Button *b = new Gui::SolidButton();
        b->onClick.connect(sigc::bind(sigc::mem_fun(this, &PickLaserMountForm::PickMount), i));
        buttonBox->PackEnd(b);
        buttonBox->PackEnd(new Gui::Label(ShipType::gunmountNames[i]));

        layoutBox->PackEnd(buttonBox);
    }

    Add(layoutBox, 0, 100);
}
StationShipMarketForm::StationShipMarketForm(FormController *controller) : FaceForm(controller)
{
	m_station = Pi::player->GetDockedWith();

	SetTitle(stringf(Lang::SOMEWHERE_SHIP_MARKET, formatarg("station", m_station->GetLabel())));

	Gui::VScrollBar *scroll = new Gui::VScrollBar();
	Gui::VScrollPortal *portal = new Gui::VScrollPortal(450);
	scroll->SetAdjustment(&portal->vscrollAdjust);

	float line_height = Gui::Screen::GetFontHeight();

	m_shiplistBox = new Gui::VBox();
	m_shiplistBox->SetSpacing(line_height*0.5f);
	UpdateShipList();
	m_shiplistBox->ShowAll();

	portal->Add(m_shiplistBox);
	portal->ShowAll();

	Gui::VBox *outerbox = new Gui::VBox();
	outerbox->SetSpacing(line_height);

	Gui::Fixed *heading = new Gui::Fixed(470, Gui::Screen::GetFontHeight());
	const float *col = Gui::Theme::Colors::tableHeading;
	heading->Add((new Gui::Label(Lang::SHIP))->Color(col), 0, 0);
	heading->Add((new Gui::Label(Lang::PRICE))->Color(col), 200, 0);
	heading->Add((new Gui::Label(Lang::PART_EX))->Color(col), 275, 0);
	heading->Add((new Gui::Label(Lang::CAPACITY))->Color(col), 370, 0);
	heading->Add((new Gui::Label(Lang::VIEW))->Color(col), 430, 0);
	outerbox->PackEnd(heading);

	Gui::HBox *body = new Gui::HBox();
	body->PackEnd(portal);
	body->PackEnd(scroll);
	outerbox->PackEnd(body);

	Add(outerbox, 0, 0);
	ShowAll();

	m_onShipsForSaleChangedConnection = m_station->onShipsForSaleChanged.connect(sigc::mem_fun(this, &StationShipMarketForm::OnShipsForSaleChanged));
}
StationShipViewForm::StationShipViewForm(FormController *controller, int marketIndex) :
	BlankForm(controller),
	m_marketIndex(marketIndex)
{
	m_station = Pi::player->GetDockedWith();

	m_flavour = m_station->GetShipsOnSale()[marketIndex];

	const ShipType &type = ShipType::types[m_flavour.type];

	SetTitle(stringf(Lang::SOMEWHERE_SHIP_MARKET, formatarg("station", m_station->GetLabel())));

	Add(new ShipSpinnerWidget(m_flavour, 400, 400), 0, 0);


	Gui::VBox *layoutBox = new Gui::VBox();
	layoutBox->SetSpacing(10.0f);
	Add(layoutBox, 420, 0);

	Gui::HBox *statsBox = new Gui::HBox();
	statsBox->SetSpacing(20.0f);
	layoutBox->PackEnd(statsBox);

	Gui::VBox *labelBox = new Gui::VBox();
	labelBox->PackEnd(new Gui::Label(Lang::SHIP_TYPE));
	labelBox->PackEnd(new Gui::Label(Lang::PRICE));
	labelBox->PackEnd(new Gui::Label(Lang::PART_EX));
	labelBox->PackEnd(new Gui::Label(Lang::REGISTRATION_ID));
	labelBox->PackEnd(new Gui::Label(" "));
	labelBox->PackEnd(new Gui::Label(Lang::WEIGHT_EMPTY));
	labelBox->PackEnd(new Gui::Label(Lang::WEIGHT_FULLY_LADEN));
	labelBox->PackEnd(new Gui::Label(Lang::CAPACITY));
	labelBox->PackEnd(new Gui::Label(" "));
	labelBox->PackEnd(new Gui::Label(Lang::FORWARD_ACCEL_EMPTY));
	labelBox->PackEnd(new Gui::Label(Lang::FORWARD_ACCEL_LADEN));
	labelBox->PackEnd(new Gui::Label(Lang::REVERSE_ACCEL_EMPTY));
	labelBox->PackEnd(new Gui::Label(Lang::REVERSE_ACCEL_LADEN));
	labelBox->PackEnd(new Gui::Label(" "));
	labelBox->PackEnd(new Gui::Label(Lang::HYPERDRIVE_FITTED));
	statsBox->PackEnd(labelBox);

	float forward_accel_empty = type.linThrust[ShipType::THRUSTER_FORWARD] / (-9.81f*1000.0f*(type.hullMass));
	float forward_accel_laden = type.linThrust[ShipType::THRUSTER_FORWARD] / (-9.81f*1000.0f*(type.hullMass+type.capacity));
	float reverse_accel_empty = -type.linThrust[ShipType::THRUSTER_REVERSE] / (-9.81f*1000.0f*(type.hullMass));
	float reverse_accel_laden = -type.linThrust[ShipType::THRUSTER_REVERSE] / (-9.81f*1000.0f*(type.hullMass+type.capacity));

	Gui::VBox *dataBox = new Gui::VBox();
	dataBox->PackEnd(new Gui::Label(type.name));
	dataBox->PackEnd(new Gui::Label(format_money(m_flavour.price)));
	dataBox->PackEnd(new Gui::Label(format_money(m_flavour.price - Pi::player->GetFlavour()->price)));
	dataBox->PackEnd(new Gui::Label(m_flavour.regid));
	dataBox->PackEnd(new Gui::Label(" "));
	dataBox->PackEnd(new Gui::Label(stringf(Lang::NUMBER_TONNES, formatarg("mass", type.hullMass))));
	dataBox->PackEnd(new Gui::Label(stringf(Lang::NUMBER_TONNES, formatarg("mass", type.hullMass + type.capacity))));
	dataBox->PackEnd(new Gui::Label(stringf( Lang::NUMBER_TONNES, formatarg("mass", type.capacity))));
	dataBox->PackEnd(new Gui::Label(" "));
	dataBox->PackEnd(new Gui::Label(stringf(Lang::NUMBER_G, formatarg("acceleration", forward_accel_empty))));
	dataBox->PackEnd(new Gui::Label(stringf(Lang::NUMBER_G, formatarg("acceleration", forward_accel_laden))));
	dataBox->PackEnd(new Gui::Label(stringf(Lang::NUMBER_G, formatarg("acceleration", reverse_accel_empty))));
	dataBox->PackEnd(new Gui::Label(stringf(Lang::NUMBER_G, formatarg("acceleration", reverse_accel_laden))));
	dataBox->PackEnd(new Gui::Label(" "));
	dataBox->PackEnd(new Gui::Label(EquipType::types[type.hyperdrive].name));
	statsBox->PackEnd(dataBox);


	Gui::HBox *row = new Gui::HBox();
	row->SetSpacing(10.0f);

	int row_size = 5, pos = 0;
	for (int drivetype = Equip::DRIVE_CLASS1; drivetype <= Equip::DRIVE_CLASS9; drivetype++) {
		if (type.capacity < EquipType::types[drivetype].mass)
			break;

		int hyperclass = EquipType::types[drivetype].pval;
		// for the sake of hyperspace range, we count ships mass as 60% of original.
		float range = Pi::CalcHyperspaceRange(hyperclass, type.hullMass + type.capacity);

		Gui::VBox *cell = new Gui::VBox();
		row->PackEnd(cell);

		cell->PackEnd(new Gui::Label(stringf(Lang::CLASS_NUMBER, formatarg("class", hyperclass))));
		if (type.capacity < EquipType::types[drivetype].mass)
			cell->PackEnd(new Gui::Label("---"));
		else
			cell->PackEnd(new Gui::Label(stringf(Lang::NUMBER_LY, formatarg("distance", range))));

		if (++pos == row_size) {
			layoutBox->PackEnd(row);

			row = new Gui::HBox();
			row->SetSpacing(15.0f);

			pos = 0;
		}
	}

	if (pos > 0)
		layoutBox->PackEnd(row);


	Gui::HBox *buttonBox = new Gui::HBox();
	buttonBox->SetSpacing(5.0f);

	Gui::SolidButton *b = new Gui::SolidButton();
	b->onClick.connect(sigc::mem_fun(this, &StationShipViewForm::BuyShip));
	buttonBox->PackEnd(b);
	buttonBox->PackEnd(new Gui::Label(Lang::BUY_THIS_SHIP));
	Add(buttonBox, 650, 30);
}
StationShipEquipmentForm::StationShipEquipmentForm(FormController *controller) : FaceForm(controller)
{
    m_station = Pi::player->GetDockedWith();

    SetTitle(stringf(Lang::SOMEWHERE_SHIP_EQUIPMENT, formatarg("station", m_station->GetLabel())));

    Gui::VScrollBar *scroll = new Gui::VScrollBar();
    Gui::VScrollPortal *portal = new Gui::VScrollPortal(450);
    scroll->SetAdjustment(&portal->vscrollAdjust);

    int NUM_ITEMS = 0;
    const float YSEP = floor(Gui::Screen::GetFontHeight() * 1.5f);
    for (int i=Equip::FIRST_SHIPEQUIP; i<=Equip::LAST_SHIPEQUIP; i++) {
        if (m_station->GetStock(static_cast<Equip::Type>(i)))
            NUM_ITEMS++;
    }

    Gui::VBox *outerbox = new Gui::VBox();

    Gui::Fixed *innerbox = new Gui::Fixed(450, NUM_ITEMS*YSEP);
    innerbox->SetTransparency(true);

    for (int i=Equip::FIRST_SHIPEQUIP, num=0; i<=Equip::LAST_SHIPEQUIP; i++) {
        Equip::Type type = static_cast<Equip::Type>(i);
        int stock = m_station->GetStock(type);
        if (!stock) continue;
        Gui::Label *l = new Gui::Label(Equip::types[i].name);
        if (Equip::types[i].description) {
            l->SetToolTip(Equip::types[i].description);
        }
        innerbox->Add(l,0,num*YSEP);

        innerbox->Add(new Gui::Label(format_money(m_station->GetPrice(type))), 200, num*YSEP);

        innerbox->Add(new Gui::Label(format_money(REMOVAL_VALUE_PERCENT * m_station->GetPrice(type) / 100)),
                      275, num*YSEP);

        innerbox->Add(new Gui::Label(stringf(Lang::NUMBER_TONNES, formatarg("mass", Equip::types[i].mass))), 360, num*YSEP);

        ButtonPair pair;
        pair.type = type;

        pair.add = new Gui::SolidButton();
        pair.add->onClick.connect(sigc::bind(sigc::mem_fun(this, &StationShipEquipmentForm::FitItem), type));
        innerbox->Add(pair.add, 400, num*YSEP);

        pair.remove = new Gui::SolidButton();
        pair.remove->onClick.connect(sigc::bind(sigc::mem_fun(this, &StationShipEquipmentForm::RemoveItem), type));
        innerbox->Add(pair.remove, 420, num*YSEP);

        m_buttons.push_back(pair);

        num++;
    }

    portal->Add(innerbox);

    Gui::Fixed *heading = new Gui::Fixed(470, Gui::Screen::GetFontHeight());
    const float *col = Gui::Theme::Colors::tableHeading;
    heading->Add((new Gui::Label(Lang::ITEM))->Color(col), 0, 0);
    heading->Add((new Gui::Label(Lang::PRICE_TO_FIT))->Color(col), 200, 0);
    heading->Add((new Gui::Label(Lang::PRICE_TO_REMOVE))->Color(col), 275, 0);
    heading->Add((new Gui::Label(Lang::WT))->Color(col), 360, 0);
    heading->Add((new Gui::Label(Lang::FIT))->Color(col), 400, 0);
    heading->Add((new Gui::Label(Lang::REMOVE))->Color(col), 420, 0);
    outerbox->PackEnd(heading);

    Gui::HBox *body = new Gui::HBox();
    body->PackEnd(portal);
    body->PackEnd(scroll);
    outerbox->PackEnd(body);

    outerbox->SetSpacing(YSEP-Gui::Screen::GetFontHeight());
    Add(outerbox, 0, 0);

}
Exemple #5
0
void SectorView::InitObject()
{
    SetTransparency(true);

    m_lineVerts.reset(new Graphics::VertexArray(Graphics::ATTRIB_POSITION, 500));
    m_secLineVerts.reset(new Graphics::VertexArray(Graphics::ATTRIB_POSITION, 500));

    Gui::Screen::PushFont("OverlayFont");
    m_clickableLabels = new Gui::LabelSet();
    m_clickableLabels->SetLabelColor(Color(178,178,178,191));
    Add(m_clickableLabels, 0, 0);
    Gui::Screen::PopFont();

    m_sectorLabel = new Gui::Label("");
    Add(m_sectorLabel, 2, Gui::Screen::GetHeight()-Gui::Screen::GetFontHeight()*2-66);
    m_distanceLabel = new Gui::Label("");
    Add(m_distanceLabel, 2, Gui::Screen::GetHeight()-Gui::Screen::GetFontHeight()-66);

    m_zoomInButton = new Gui::ImageButton("icons/zoom_in.png");
    m_zoomInButton->SetToolTip(Lang::ZOOM_IN);
    m_zoomInButton->SetRenderDimensions(30, 22);
    Add(m_zoomInButton, 700, 5);

    m_zoomLevelLabel = (new Gui::Label(""))->Color(69, 219, 235);
    Add(m_zoomLevelLabel, 640, 5);

    m_zoomOutButton = new Gui::ImageButton("icons/zoom_out.png");
    m_zoomOutButton->SetToolTip(Lang::ZOOM_OUT);
    m_zoomOutButton->SetRenderDimensions(30, 22);
    Add(m_zoomOutButton, 732, 5);

    Add(new Gui::Label(Lang::SEARCH), 650, 500);
    m_searchBox = new Gui::TextEntry();
    m_searchBox->onKeyPress.connect(sigc::mem_fun(this, &SectorView::OnSearchBoxKeyPress));
    Add(m_searchBox, 700, 500);

    m_disk.reset(new Graphics::Drawables::Disk(Pi::renderer, Color::WHITE, 0.2f));

    m_infoBox = new Gui::VBox();
    m_infoBox->SetTransparency(false);
    m_infoBox->SetBgColor(0.05f, 0.05f, 0.12f, 0.5f);
    m_infoBox->SetSpacing(10.0f);
    Add(m_infoBox, 5, 5);

    // 1. holds info about current, selected, targeted systems
    Gui::VBox *locationsBox = new Gui::VBox();
    locationsBox->SetSpacing(5.f);
    // 1.1 current system
    Gui::VBox *systemBox = new Gui::VBox();
    Gui::HBox *hbox = new Gui::HBox();
    hbox->SetSpacing(5.0f);
    Gui::Button *b = new Gui::SolidButton();
    b->onClick.connect(sigc::mem_fun(this, &SectorView::GotoCurrentSystem));
    hbox->PackEnd(b);
    hbox->PackEnd((new Gui::Label(Lang::CURRENT_SYSTEM))->Color(255, 255, 255));
    systemBox->PackEnd(hbox);
    hbox = new Gui::HBox();
    hbox->SetSpacing(5.0f);
    m_currentSystemLabels.systemName = (new Gui::Label(""))->Color(255, 255, 0);
    m_currentSystemLabels.distance = (new Gui::Label(""))->Color(255, 0, 0);
    hbox->PackEnd(m_currentSystemLabels.systemName);
    hbox->PackEnd(m_currentSystemLabels.distance);
    systemBox->PackEnd(hbox);
    m_currentSystemLabels.starType = (new Gui::Label(""))->Color(255, 0, 255);
    m_currentSystemLabels.shortDesc = (new Gui::Label(""))->Color(255, 0, 255);
    systemBox->PackEnd(m_currentSystemLabels.starType);
    systemBox->PackEnd(m_currentSystemLabels.shortDesc);
    locationsBox->PackEnd(systemBox);
    // 1.2 selected system
    systemBox = new Gui::VBox();
    hbox = new Gui::HBox();
    hbox->SetSpacing(5.0f);
    b = new Gui::SolidButton();
    b->onClick.connect(sigc::mem_fun(this, &SectorView::GotoSelectedSystem));
    hbox->PackEnd(b);
    hbox->PackEnd((new Gui::Label(Lang::SELECTED_SYSTEM))->Color(255, 255, 255));
    systemBox->PackEnd(hbox);
    hbox = new Gui::HBox();
    hbox->SetSpacing(5.0f);
    m_selectedSystemLabels.systemName = (new Gui::Label(""))->Color(255, 255, 0);
    m_selectedSystemLabels.distance = (new Gui::Label(""))->Color(255, 0, 0);
    hbox->PackEnd(m_selectedSystemLabels.systemName);
    hbox->PackEnd(m_selectedSystemLabels.distance);
    systemBox->PackEnd(hbox);
    m_selectedSystemLabels.starType = (new Gui::Label(""))->Color(255, 0, 255);
    m_selectedSystemLabels.shortDesc = (new Gui::Label(""))->Color(255, 0, 255);
    systemBox->PackEnd(m_selectedSystemLabels.starType);
    systemBox->PackEnd(m_selectedSystemLabels.shortDesc);
    locationsBox->PackEnd(systemBox);
    // 1.3 targeted system
    systemBox = new Gui::VBox();
    hbox = new Gui::HBox();
    hbox->SetSpacing(5.0f);
    b = new Gui::SolidButton();
    b->onClick.connect(sigc::mem_fun(this, &SectorView::GotoHyperspaceTarget));
    hbox->PackEnd(b);
    hbox->PackEnd((new Gui::Label(Lang::HYPERSPACE_TARGET))->Color(255, 255, 255));
    m_hyperspaceLockLabel = (new Gui::Label(""))->Color(255, 255, 255);
    hbox->PackEnd(m_hyperspaceLockLabel);
    systemBox->PackEnd(hbox);
    hbox = new Gui::HBox();
    hbox->SetSpacing(5.0f);
    m_targetSystemLabels.systemName = (new Gui::Label(""))->Color(255, 255, 0);
    m_targetSystemLabels.distance = (new Gui::Label(""))->Color(255, 0, 0);
    hbox->PackEnd(m_targetSystemLabels.systemName);
    hbox->PackEnd(m_targetSystemLabels.distance);
    systemBox->PackEnd(hbox);
    m_targetSystemLabels.starType = (new Gui::Label(""))->Color(255, 0, 255);
    m_targetSystemLabels.shortDesc = (new Gui::Label(""))->Color(255, 0, 255);
    systemBox->PackEnd(m_targetSystemLabels.starType);
    systemBox->PackEnd(m_targetSystemLabels.shortDesc);
    locationsBox->PackEnd(systemBox);
    m_infoBox->PackEnd(locationsBox);

    // 2. holds options for displaying systems
    Gui::VBox *filterBox = new Gui::VBox();
    // 2.1 Draw vertical lines
    hbox = new Gui::HBox();
    hbox->SetSpacing(5.0f);
    m_drawSystemLegButton = (new Gui::ToggleButton());
    m_drawSystemLegButton->SetPressed(false); // TODO: replace with var
    hbox->PackEnd(m_drawSystemLegButton);
    Gui::Label *label = (new Gui::Label(Lang::DRAW_VERTICAL_LINES))->Color(255, 255, 255);
    hbox->PackEnd(label);
    filterBox->PackEnd(hbox);
    // 2.2 Draw planet labels
    hbox = new Gui::HBox();
    hbox->SetSpacing(5.0f);
    m_drawOutRangeLabelButton = new Gui::ToggleButton();
    m_drawOutRangeLabelButton->SetPressed(false); // TODO: replace with var
    hbox->PackEnd(m_drawOutRangeLabelButton);
    label = (new Gui::Label(Lang::DRAW_OUT_RANGE_LABELS))->Color(255, 255, 255);
    hbox->PackEnd(label);
    filterBox->PackEnd(hbox);

    m_infoBox->PackEnd(filterBox);

    m_onMouseWheelCon =
        Pi::onMouseWheel.connect(sigc::mem_fun(this, &SectorView::MouseWheel));

    UpdateSystemLabels(m_currentSystemLabels, m_current);
    UpdateSystemLabels(m_selectedSystemLabels, m_selected);
    UpdateSystemLabels(m_targetSystemLabels, m_hyperspaceTarget);

    UpdateHyperspaceLockLabel();

    m_factionBox = new Gui::VBox();
    m_factionBox->SetTransparency(false);
    m_factionBox->SetBgColor(0.05f, 0.05f, 0.12f, 0.5f);
    m_factionBox->SetSpacing(5.0f);
    m_factionBox->HideAll();
    Add(m_factionBox, 5, 5);
}