Tentative Randomless-Entropy variant.
[tagua/yd.git] / src / ui.cpp
blob1a3c31de0c67fe08f4eb8e5f2fe5284098e78148
1 /*
2 Copyright (c) 2006 Paolo Capriotti <p.capriotti@gmail.com>
3 (c) 2006 Maurizio Monge <maurizio.monge@kdemail.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 */
11 #include <QApplication>
12 #include <QClipboard>
13 #include <KActionCollection>
14 #include <KAction>
15 #include <KDebug>
16 #include "ui.h"
17 #include "controllers/abstract.h"
18 #include "graphicalgame.h"
20 using namespace boost;
22 #define SYNC_ACTION(NAME, ENUM) \
23 m_ui->m_actions->action(NAME)->setEnabled(state & GraphicalGame::ENUM)
24 class UIActionStateObserver : public ActionStateObserver {
25 const UI* m_ui;
26 Controller* m_controller;
27 public:
28 UIActionStateObserver(const UI* ui, const shared_ptr<Controller>& controller)
29 : m_ui(ui)
30 , m_controller(controller.get()) {
31 Q_ASSERT(m_controller);
34 virtual void notifyActionStateChange(GraphicalGame::ActionState state) {
35 // check that the associated controller is active
36 if (m_ui->controller().get() == m_controller) {
37 SYNC_ACTION("begin", BEGIN);
38 SYNC_ACTION("back", BACK);
39 SYNC_ACTION("forward", FORWARD);
40 SYNC_ACTION("end", END);
41 SYNC_ACTION("edit_undo", UNDO);
42 SYNC_ACTION("edit_redo", REDO);
46 #undef SYNC_ACTION
48 UI::UI(KActionCollection* actions)
49 : m_current_tab(NULL)
50 , m_actions(actions) {
53 boost::shared_ptr<Controller>& UI::controller() {
54 Q_ASSERT(m_current_tab);
56 boost::shared_ptr<Controller>& res = m_controller[m_current_tab];
57 Q_ASSERT(res);
59 return res;
62 boost::shared_ptr<Controller> UI::controller() const {
63 Q_ASSERT(m_current_tab);
65 ControllerMap::const_iterator it = m_controller.find(m_current_tab);
66 Q_ASSERT(it != m_controller.end());
67 return it->second;
70 void UI::addController(QWidget* w, const shared_ptr<Controller>& controller) {
71 m_current_tab = w;
72 setController(controller);
75 void UI::setController(const shared_ptr<Controller>& controller) {
76 Q_ASSERT(m_current_tab);
77 m_controller[m_current_tab] = controller;
78 controller->setUI(*this);
81 void UI::removeController(QWidget* w) {
82 controller()->end();
83 kDebug() << "removing controller " << w;
84 m_controller.erase(w);
87 void UI::setCurrentTab(QWidget* w) {
88 m_current_tab = w;
89 controller()->activate();
92 bool UI::undo() {
93 controller()->undo();
94 return true;
97 bool UI::redo() {
98 controller()->redo();
99 return true;
102 bool UI::truncate() {
103 controller()->truncate();
104 return true;
107 bool UI::promoteVariation() {
108 controller()->promoteVariation();
109 return true;
112 bool UI::back() {
113 return controller()->back();
116 bool UI::forward() {
117 return controller()->forward();
120 void UI::gotoFirst() {
121 controller()->gotoFirst();
124 void UI::gotoLast() {
125 controller()->gotoLast();
128 void UI::pgnCopy() {
129 QClipboard* cb = QApplication::clipboard();
130 cb->setText(currentPGN());
133 QString UI::currentPGN() {
134 return controller()->save();
137 void UI::pgnPaste() {
138 QClipboard* cb = QApplication::clipboard();
139 pgnPaste(cb->text());
142 void UI::pgnPaste(const QString&) {
143 //controller()->loadPGN(pgn);
146 void UI::pgnPaste(const PGN& pgn) {
147 controller()->loadPGN(pgn);
150 void UI::clearBoard() {
151 controller()->clearBoard();
154 void UI::setStartingPosition() {
155 controller()->setStartingPosition();
158 void UI::copyPosition() {
159 QClipboard* cb = QApplication::clipboard();
160 cb->setText(controller()->fen());
163 void UI::pastePosition() {
164 QClipboard* cb = QApplication::clipboard();
165 controller()->setFEN(cb->text());
168 void UI::setTurn(int turn) {
169 controller()->setTurn(turn);
172 StatePtr UI::position() const {
173 return controller()->currentPosition();
176 void UI::createCtrlAction() {
177 controller()->createCtrlAction();
180 void UI::destroyCtrlAction() {
181 controller()->destroyCtrlAction();
184 ActionCollection* UI::variantActions() const {
185 return controller()->variantActions();
188 EntityToken UI::addPlayingEngine(const IColor* side, const shared_ptr<Engine>& engine) {
189 return controller()->addPlayingEngine(side, engine);
192 // EntityToken UI::addAnalysingEngine(const shared_ptr<Engine>& engine) {
193 // return controller()->addAnalysingEngine(engine);
194 // }
196 void UI::removeEntity(const EntityToken& token) {
197 controller()->removeEntity(token);
200 void UI::end() {
201 controller() = controller()->end();
204 void UI::detach() {
205 controller()->detach();
208 QString UI::currentVariant() const {
209 return controller()->variant();
212 void UI::reloadSettings() {
213 for (ControllerMap::iterator it = m_controller.begin(),
214 end = m_controller.end();
215 it != end;
216 ++it) {
217 it->second->reloadSettings();
221 shared_ptr<ActionStateObserver>
222 UI::createActionStateObserver(const shared_ptr<Controller>& controller) const {
223 return shared_ptr<UIActionStateObserver>(
224 new UIActionStateObserver(this, controller));
227 KUrl UI::url() const { return controller()->url(); }
228 void UI::setUrl(const KUrl& url) { controller()->setUrl(url); }