1//============================================================================
2//
3// SSSS tt lll lll
4// SS SS tt ll ll
5// SS tttttt eeee ll ll aaaa
6// SSSS tt ee ee ll ll aa
7// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
8// SS SS tt ee ll ll aa aa
9// SSSS ttt eeeee llll llll aaaaa
10//
11// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
12// and the Stella Team
13//
14// See the file "License.txt" for information on usage and redistribution of
15// this file, and for a DISCLAIMER OF ALL WARRANTIES.
16//============================================================================
17
18#include "Base.hxx"
19#include "Font.hxx"
20#include "OSystem.hxx"
21#include "Debugger.hxx"
22#include "TIADebug.hxx"
23#include "Widget.hxx"
24#include "EditTextWidget.hxx"
25#include "GuiObject.hxx"
26
27#include "TiaInfoWidget.hxx"
28
29// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
30TiaInfoWidget::TiaInfoWidget(GuiObject* boss, const GUI::Font& lfont,
31 const GUI::Font& nfont,
32 int x, int y, int max_w)
33 : Widget(boss, lfont, x, y, 16, 16),
34 CommandSender(boss)
35{
36 bool longstr = 34 * lfont.getMaxCharWidth() <= max_w;
37
38 x += 5;
39 const int lineHeight = lfont.getLineHeight();
40 int xpos = x, ypos = y + 10;
41 int lwidth = lfont.getStringWidth(longstr ? "Frame Cycle " : "F. Cycle ");
42 int fwidth = 5 * lfont.getMaxCharWidth() + 4;
43
44 // Add frame info
45 new StaticTextWidget(boss, lfont, xpos, ypos, lwidth, lineHeight,
46 longstr ? "Frame Count " : "Frame ",
47 TextAlign::Left);
48 xpos += lwidth;
49 myFrameCount = new EditTextWidget(boss, nfont, xpos, ypos-1, fwidth, lineHeight, "");
50 myFrameCount->setEditable(false, true);
51
52 xpos = x; ypos += lineHeight + 5;
53 new StaticTextWidget(boss, lfont, xpos, ypos, lwidth, lineHeight,
54 longstr ? "Frame Cycle " : "F. Cycle ",
55 TextAlign::Left);
56 xpos += lwidth;
57 myFrameCycles = new EditTextWidget(boss, nfont, xpos, ypos-1, fwidth, lineHeight, "");
58 myFrameCycles->setEditable(false, true);
59
60 xpos = x + 20; ypos += lineHeight + 8;
61 myVSync = new CheckboxWidget(boss, lfont, xpos, ypos-3, "VSync", 0);
62 myVSync->setEditable(false);
63
64 xpos = x + 20; ypos += lineHeight + 5;
65 myVBlank = new CheckboxWidget(boss, lfont, xpos, ypos-3, "VBlank", 0);
66 myVBlank->setEditable(false);
67
68 xpos = x + lwidth + myFrameCycles->getWidth() + 8; ypos = y + 10;
69 lwidth = lfont.getStringWidth(longstr ? "Color Clock " : "Pixel Pos ");
70 fwidth = 3 * lfont.getMaxCharWidth() + 4;
71
72 new StaticTextWidget(boss, lfont, xpos, ypos,
73 lfont.getStringWidth(longstr ? "Scanline" : "Scn Ln"), lineHeight,
74 longstr ? "Scanline" : "Scn Ln", TextAlign::Left);
75
76 myScanlineCountLast = new EditTextWidget(boss, nfont, xpos+lwidth, ypos-1, fwidth,
77 lineHeight, "");
78 myScanlineCountLast->setEditable(false, true);
79
80 myScanlineCount = new EditTextWidget(boss, nfont,
81 xpos+lwidth - myScanlineCountLast->getWidth() - 2, ypos-1, fwidth,
82 lineHeight, "");
83 myScanlineCount->setEditable(false, true);
84
85 ypos += lineHeight + 5;
86 new StaticTextWidget(boss, lfont, xpos, ypos, lwidth, lineHeight,
87 longstr ? "Scan Cycle " : "Scn Cycle", TextAlign::Left);
88
89 myScanlineCycles = new EditTextWidget(boss, nfont, xpos+lwidth, ypos-1, fwidth,
90 lineHeight, "");
91 myScanlineCycles->setEditable(false, true);
92
93 ypos += lineHeight + 5;
94 new StaticTextWidget(boss, lfont, xpos, ypos, lwidth, lineHeight,
95 "Pixel Pos ", TextAlign::Left);
96
97 myPixelPosition = new EditTextWidget(boss, nfont, xpos+lwidth, ypos-1, fwidth,
98 lineHeight, "");
99 myPixelPosition->setEditable(false, true);
100
101 ypos += lineHeight + 5;
102 new StaticTextWidget(boss, lfont, xpos, ypos, lwidth, lineHeight,
103 longstr ? "Color Clock " : "Color Clk ", TextAlign::Left);
104
105 myColorClocks = new EditTextWidget(boss, nfont, xpos+lwidth, ypos-1, fwidth,
106 lineHeight, "");
107 myColorClocks->setEditable(false, true);
108
109 // Calculate actual dimensions
110 _w = myColorClocks->getAbsX() + myColorClocks->getWidth() - x;
111 _h = ypos + lineHeight;
112}
113
114// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
115void TiaInfoWidget::handleMouseDown(int x, int y, MouseButton b, int clickCount)
116{
117//cerr << "TiaInfoWidget button press: x = " << x << ", y = " << y << endl;
118}
119
120// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
121void TiaInfoWidget::handleCommand(CommandSender* sender, int cmd, int data, int id)
122{
123}
124
125// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
126void TiaInfoWidget::loadConfig()
127{
128 Debugger& dbg = instance().debugger();
129 TIADebug& tia = dbg.tiaDebug();
130 const TiaState& oldTia = static_cast<const TiaState&>(tia.getOldState());
131
132 myFrameCount->setText(Common::Base::toString(tia.frameCount(), Common::Base::F_10_5),
133 tia.frameCount() != oldTia.info[0]);
134 myFrameCycles->setText(Common::Base::toString(tia.frameCycles(), Common::Base::F_10_5),
135 tia.frameCycles() != oldTia.info[1]);
136
137 myVSync->setState(tia.vsync(), tia.vsyncAsInt() != oldTia.info[2]);
138 myVBlank->setState(tia.vblank(), tia.vblankAsInt() != oldTia.info[3]);
139
140 int clk = tia.clocksThisLine();
141 myScanlineCount->setText(Common::Base::toString(tia.scanlines(), Common::Base::F_10_3),
142 tia.scanlines() != oldTia.info[4]);
143 myScanlineCountLast->setText(
144 Common::Base::toString(tia.scanlinesLastFrame(), Common::Base::F_10_3),
145 tia.scanlinesLastFrame() != oldTia.info[5]);
146 myScanlineCycles->setText(Common::Base::toString(clk/3, Common::Base::F_10),
147 clk != oldTia.info[6]);
148 myPixelPosition->setText(Common::Base::toString(clk-68, Common::Base::F_10),
149 clk != oldTia.info[6]);
150 myColorClocks->setText(Common::Base::toString(clk, Common::Base::F_10),
151 clk != oldTia.info[6]);
152}
153