+++ /dev/null
-/************************************************************************
-
- IMPORTANT NOTE : this file contains two clearly delimited sections :
- the ARCHITECTURE section (in two parts) and the USER section. Each section
- is governed by its own copyright and license. Please check individually
- each section for license and copyright information.
-*************************************************************************/
-
-/*******************BEGIN ARCHITECTURE SECTION (part 1/2)****************/
-
-/************************************************************************
- FAUST Architecture File
- Copyright (C) 2004-2011 GRAME, Centre National de Creation Musicale
- ---------------------------------------------------------------------
- This Architecture section is free software; you can redistribute it
- and/or modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either version 3
- of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; If not, see <http://www.gnu.org/licenses/>.
-
- EXCEPTION : As a special exception, you may create a larger work
- that contains this FAUST architecture section and distribute
- that work under terms of your choice, so long as this FAUST
- architecture section is not modified.
-
-
- ************************************************************************
- ************************************************************************/
-
-#import <UIKit/UIKit.h>
-#import "iPhoneViewController.h"
-
-#include "misc.h"
-
-#include <list>
-#include <map>
-
-using namespace std;
-
-/******************************************************************************
-*******************************************************************************
-
- GRAPHIC USER INTERFACE (v2)
- abstract interfaces
-
-*******************************************************************************
-*******************************************************************************/
-
-//typedef void (*uiCallback)(float val, void* data);
-
-//=================
-// COCOA part
-//=================
-
-class UI;
-
-@interface uiItem : NSObject
-{
- UI* fGUI;
- float* fZone;
- float fCache;
-}
-
-- (id)initWithValues:(UI*)ui:(float*)zone;
-- (void)modifyZone:(float)v;
-- (float)cache;
-- (void)reflectZone;
-
-@end
-
-/**
- * Graphic User Interface : abstract definition
- */
-
-class UI
-{
- typedef list<uiItem*> clist;
- typedef map<float*, clist*> zmap;
-
- protected:
-
- static list<UI*> fGuiList;
- zmap fZoneMap;
- bool fStopped;
-
- public:
-
- UI() : fStopped(false)
- {
- fGuiList.push_back(this);
- }
-
- virtual ~UI()
- {
- // suppression de this dans fGuiList
- }
-
- // -- registerZone(z,c) : zone management
-
- void registerZone(float* z, uiItem* c)
- {
- if (fZoneMap.find(z) == fZoneMap.end()) {
- fZoneMap[z] = new clist();
- }
- fZoneMap[z]->push_back(c);
- }
-
- // -- saveState(filename) : save the value of every zone to a file
-
- void saveState(const char* filename)
- {
- ofstream f(filename);
-
- if (!f.is_open()) {
- } else {
- for (zmap::iterator i = fZoneMap.begin(); i != fZoneMap.end(); i++) {
- f << *(i->first) << ' ';
- }
- }
-
- f << endl;
- f.close();
- }
-
- // -- recallState(filename) : load the value of every zone from a file
-
- void recallState(const char* filename)
- {
- ifstream f(filename);
- if (f.good()) {
- for (zmap::iterator i = fZoneMap.begin(); i != fZoneMap.end(); i++) {
- f >> *(i->first);
- }
- }
- f.close();
- updateAllZones();
- }
-
- void updateAllZones();
-
- void updateZone(float* z);
-
- static void updateAllGuis()
- {
- list<UI*>::iterator g;
- for (g = fGuiList.begin(); g != fGuiList.end(); g++) {
- (*g)->updateAllZones();
- }
- }
-
- // -- active widgets
-
- virtual void addButton(const char* label, float* zone) = 0;
- virtual void addToggleButton(const char* label, float* zone) = 0;
- virtual void addCheckButton(const char* label, float* zone) = 0;
- virtual void addVerticalSlider(const char* label, float* zone, float init, float min, float max, float step) = 0;
- virtual void addHorizontalSlider(const char* label, float* zone, float init, float min, float max, float step) = 0;
- virtual void addNumEntry(const char* label, float* zone, float init, float min, float max, float step) = 0;
-
- // -- passive widgets
-
- virtual void addNumDisplay(const char* label, float* zone, int precision) = 0;
- virtual void addTextDisplay(const char* label, float* zone, const char* names[], float min, float max) = 0;
- virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) = 0;
- virtual void addVerticalBargraph(const char* label, float* zone, float min, float max) = 0;
-
- //void addCallback(float* zone, uiCallback foo, void* data);
-
- // -- widget's layouts
-
- virtual void openFrameBox(const char* label) = 0;
- virtual void openTabBox(const char* label) = 0;
- virtual void openHorizontalBox(const char* label) = 0;
- virtual void openVerticalBox(const char* label) = 0;
-
- // -- extra widget's layouts
-
- virtual void openDialogBox(const char* label, float* zone) = 0;
- virtual void openEventBox(const char* label) = 0;
- virtual void openHandleBox(const char* label) = 0;
- virtual void openExpanderBox(const char* label, float* zone) = 0;
-
- virtual void closeBox() = 0;
-
- virtual void show() {};
- virtual void run() {};
-
- void stop() { fStopped = true; }
- bool stopped() { return fStopped; }
-
- virtual void declare(float* zone, const char* key, const char* value) {}
-};
-
-/**
- * Update all user items reflecting zone z
- */
-
-void UI::updateZone(float* z)
-{
- float v = *z;
- clist* l = fZoneMap[z];
-
- for (clist::iterator c = l->begin(); c != l->end(); c++) {
- if ([(*c) cache] != v) [(*c) reflectZone];
- }
-}
-
-/**
- * Update all user items not up to date
- */
-
-inline void UI::updateAllZones()
-{
- for (zmap::iterator m = fZoneMap.begin(); m != fZoneMap.end(); m++) {
- float* z = m->first;
- clist* l = m->second;
- float v = *z;
- for (clist::iterator c = l->begin(); c != l->end(); c++) {
- if ([(*c) cache] != v) [(*c) reflectZone];
- }
- }
-}
-
-/*
-inline void UI::addCallback(float* zone, uiCallback foo, void* data)
-{
- new uiCallbackItem(this, zone, foo, data);
-};
-*/
-
-#define WIDGET_SLICE 50.f
-#define OFFSET_Y 80.f
-
-#define SCREEN_WIDTH 320
-#define SCREEN_HEIGHT 480
-
-@implementation uiItem
-
-- (id)initWithValues:(UI*)ui:(float*)zone
-{
- fGUI = ui;
- fZone = zone;
- fCache = -123456.654321;
- ui->registerZone(zone, self);
- return self;
-}
-
-- (void)modifyZone:(float)v
-{
- fCache = v;
-
- if (*fZone != v) {
- *fZone = v;
- fGUI->updateZone(fZone);
- }
-}
-
-- (float)cache
-{
- return fCache;
-}
-
-// To implement in subclasses
-
-- (void)reflectZone
-{}
-
-@end
-
-// -------------------------- Slider -----------------------------------
-
-@interface uiSlider : uiItem
-{
- UISlider* fSlider;
- UITextField* fTextField;
-}
-
-- (void)changed:(UISlider*)sender;
-- (void)reflectZone;
-- (id)initWithValues:(int)index:(UI*)ui:(iPhoneViewController*)controler:(const char*)label:(float*)zone:(float)init:(float)min:(float)max:(float)step;
-
-@end
-
-@implementation uiSlider
-
-- (id)initWithValues:(int)index:(UI*)ui:(iPhoneViewController*)controler:(const char*)name:(float*)zone:(float)init:(float)min:(float)max:(float)step
-{
- if (self = [super initWithValues:ui:zone]) {
-
- CGRect labelFrame = CGRectMake(0.0, OFFSET_Y + WIDGET_SLICE * index - 5.f, 130.0, 30.0);
- UILabel *label = [[UILabel alloc] initWithFrame:labelFrame];
- [label setFont:[UIFont boldSystemFontOfSize:12]];
- label.textAlignment = UITextAlignmentCenter;
- [label setText:[[NSString alloc] initWithCString:name encoding:NSASCIIStringEncoding]];
- label.textColor = [UIColor blackColor ];
- label.backgroundColor = [UIColor lightGrayColor];
- [controler.view addSubview:label];
-
- CGRect frame = CGRectMake(130.0f, OFFSET_Y + WIDGET_SLICE * index, 110.0f, 7.0f);
- fSlider = [[UISlider alloc] initWithFrame:frame];
- [fSlider addTarget:self action:@selector(changed:)forControlEvents:UIControlEventValueChanged];
- fSlider.minimumValue = min;
- fSlider.maximumValue = max;
- fSlider.continuous = YES;
- fSlider.value = init;
- [controler.view addSubview:fSlider];
-
- CGRect textFieldFrame = CGRectMake(250.0, OFFSET_Y + WIDGET_SLICE * index, 60.0, 20.0);
- fTextField = [[UITextField alloc] initWithFrame:textFieldFrame];
- [fTextField setBorderStyle:UITextBorderStyleLine];
- fTextField.textAlignment = UITextAlignmentCenter;
- [fTextField setEnabled:NO];
- [fTextField setTextColor:[UIColor blackColor]];
- [fTextField setFont:[UIFont systemFontOfSize:14]];
- [fTextField setPlaceholder:[NSString stringWithFormat:@"%1.2f", init]];
- [fTextField setBackgroundColor:[UIColor whiteColor]];
- [fTextField setAdjustsFontSizeToFitWidth:YES];
- fTextField.keyboardType = UIKeyboardTypeNumbersAndPunctuation;
- [controler.view addSubview:fTextField];
- }
- return self;
-}
-
-- (void)changed:(UISlider*)sender
-{
- [self modifyZone:sender.value];
- [fTextField setPlaceholder:[NSString stringWithFormat:@"%1.2f", sender.value]];
-}
-
-- (void)reflectZone;
-{
- float v = *fZone;
- fCache = v;
- fSlider.value = v;
- [fTextField setPlaceholder:[NSString stringWithFormat:@"%1.2f", v]];
-}
-
-- (void)dealloc
-{
- [fSlider release];
- [fTextField release];
- [super dealloc];
-}
-
-@end
-
-// --------------------------- Press button ---------------------------
-
-#define kStdButtonWidth 100.0
-#define kStdButtonHeight 40.0
-
-@interface uiButton : uiItem
-{
- UIButton* fButton;
-}
-
-- (void)pressed:(UIButton*)sender;
-- (void)released:(UIButton*)sender;
-- (void)reflectZone;
-- (id)initWithValues:(int)index:(UI*)ui:(iPhoneViewController*)controler:(const char*)label:(float*)zone;
-
-@end
-
-@implementation uiButton
-
-- (id)initWithValues:(int)index:(UI*)ui:(iPhoneViewController*)controler:(const char*)name:(float*)zone
-{
- if (self = [super initWithValues:ui:zone]) {
- fButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
- fButton.frame = CGRectMake(SCREEN_WIDTH/2 - kStdButtonWidth/2, OFFSET_Y + WIDGET_SLICE * index - 5.f, kStdButtonWidth, kStdButtonHeight);
- [fButton setTitle:[[NSString alloc] initWithCString:name encoding:NSASCIIStringEncoding] forState:UIControlStateNormal];
- fButton.backgroundColor = [UIColor clearColor];
- [fButton addTarget:self action:@selector(pressed:) forControlEvents:UIControlEventTouchDown];
- [fButton addTarget:self action:@selector(released:) forControlEvents:UIControlEventTouchUpInside];
- [controler.view addSubview:fButton];
- }
- return self;
-}
-
-- (void)pressed:(UIButton*)sender
-{
- [self modifyZone:1.0f];
-}
-
-- (void)released:(UIButton*)sender
-{
- [self modifyZone:0.0f];
-}
-
-- (void)reflectZone
-{
- float v = *fZone;
- fCache = v;
- //if (v > 0.0) gtk_button_pressed(fButton); else gtk_button_released(fButton);
-}
-
-- (void)dealloc
-{
- [fButton release];
- [super dealloc];
-}
-
-@end
-
-// ------------------------------ Num Entry -----------------------------------
-
-@interface uiNumEntry : uiItem
-{
- UITextField* fTextField;
-}
-
-- (id)initWithValues:(int)index:(UI*)ui:(iPhoneViewController*)controler:(const char*)label:(float*)zone:(float)init:(float)min:(float)max:(float)step;
-
-@end
-
-@implementation uiNumEntry
-
-- (id)initWithValues:(int)index:(UI*)ui:(iPhoneViewController*)controler:(const char*)label:(float*)zone:(float)init:(float)min:(float)max:(float)step
-{
- if (self = [super initWithValues:ui:zone]) {
- CGRect textFieldFrame = CGRectMake(SCREEN_WIDTH/2 - kStdButtonWidth/2, OFFSET_Y + WIDGET_SLICE * index - 5.f, kStdButtonWidth, kStdButtonHeight);
- fTextField = [[UITextField alloc] initWithFrame:textFieldFrame];
- [fTextField setTextColor:[UIColor blackColor]];
- [fTextField setFont:[UIFont systemFontOfSize:14]];
- [fTextField setPlaceholder:@"<enter text>"];
- [fTextField setBackgroundColor:[UIColor whiteColor]];
- fTextField.keyboardType = UIKeyboardTypeDefault;
-
- [controler.view addSubview:fTextField];
- }
- return self;
-}
-
-- (void)dealloc
-{
- [fTextField release];
- [super dealloc];
-}
-
-@end
-
-
-class CocoaUI : public UI
-{
-
-private:
-
- UIWindow* fWindow;
- iPhoneViewController* fViewController;
- MY_Meta* fMetadata;
-
- list <uiItem*> fWidgetList;
-
- void insert(const char* label, uiItem* widget)
- {
- fWidgetList.push_back(widget);
- [fViewController.view setContentSize:CGSizeMake(320, WIDGET_SLICE * fWidgetList.size() + 100.f)];
- }
-
-public:
-
- // -- Labels and metadata
-
- // virtual void declare (float* zone, const char* key, const char* value);
- // virtual int checkLabelOptions (GtkWidget* widget, const string& fullLabel, string& simplifiedLabel);
- // virtual void checkForTooltip (float* zone, GtkWidget* widget);
-
- // -- layout groups
-
- CocoaUI(UIWindow* window, iPhoneViewController* viewController, MY_Meta* metadata)
- {
- fViewController = viewController;
- fWindow = window;
- fMetadata = metadata;
-
- CGRect titleFrame = CGRectMake(0.0, 0.0f, 320.0, 75.0);
- UIView *titleView = [[UIView alloc] initWithFrame:titleFrame];
- titleView.backgroundColor = [UIColor brownColor];
- [fViewController.view addSubview:titleView];
-
- if (fMetadata->find("name") != fMetadata->end()) {
- const char* name = (*fMetadata->find("name")).second;
- CGRect labelFrame = CGRectMake(0.0, 20.0f, 320.0, 30.0);
- UILabel *label = [[UILabel alloc] initWithFrame:labelFrame];
- [label setFont:[UIFont boldSystemFontOfSize:18]];
- label.textAlignment = UITextAlignmentCenter;
- [label setText:[[NSString alloc] initWithCString:name encoding:NSASCIIStringEncoding]];
- label.textColor = [UIColor blackColor ];
- label.backgroundColor = [UIColor brownColor];
- [fViewController.view addSubview:label];
- }
-
- if (fMetadata->find("author") != fMetadata->end()) {
- const char* name = (*fMetadata->find("author")).second;
- CGRect labelFrame = CGRectMake(0.0, 45.0f, 320.0, 30.0);
- UILabel *label = [[UILabel alloc] initWithFrame:labelFrame];
- [label setFont:[UIFont boldSystemFontOfSize:14]];
- label.textAlignment = UITextAlignmentCenter;
- [label setText:[[NSString alloc] initWithCString:name encoding:NSASCIIStringEncoding]];
- label.textColor = [UIColor blackColor ];
- label.backgroundColor = [UIColor brownColor];
- [fViewController.view addSubview:label];
- }
-
- [window addSubview:viewController.view];
- [window makeKeyAndVisible];
- }
-
- ~CocoaUI()
- {
- [fViewController release];
- [fWindow release];
- }
-
- virtual void openFrameBox(const char* label)
- {}
- virtual void openTabBox(const char* label = "")
- {}
- virtual void openHorizontalBox(const char* label = "")
- {}
- virtual void openVerticalBox(const char* label = "")
- {}
-
- // -- extra widget's layouts
-
- virtual void openDialogBox(const char* label, float* zone)
- {}
- virtual void openEventBox(const char* label = "")
- {}
- virtual void openHandleBox(const char* label = "")
- {}
- virtual void openExpanderBox(const char* label, float* zone)
- {}
-
- virtual void closeBox()
- {}
-
- //virtual void adjustStack(int n);
-
- // -- active widgets
-
- virtual void addButton(const char* label, float* zone)
- {
- uiItem* item = [[uiButton alloc] initWithValues:fWidgetList.size():this:fViewController:label:zone];
- insert(label, item);
- }
- virtual void addToggleButton(const char* label, float* zone)
- {}
- virtual void addCheckButton(const char* label, float* zone)
- {}
- virtual void addVerticalSlider(const char* label, float* zone, float init, float min, float max, float step)
- {
- uiItem* item = [[uiSlider alloc] initWithValues:fWidgetList.size():this:fViewController:label:zone:init:min:max:step];
- insert(label, item);
- }
- virtual void addHorizontalSlider(const char* label, float* zone, float init, float min, float max, float step)
- {
- uiItem* item = [[uiSlider alloc] initWithValues:fWidgetList.size():this:fViewController:label:zone:init:min:max:step];
- insert(label, item);
- }
- virtual void addNumEntry(const char* label, float* zone, float init, float min, float max, float step)
- {
- uiItem* item = [[uiNumEntry alloc] initWithValues:fWidgetList.size():this:fViewController:label:zone:init:min:max:step];
- insert(label, item);
- }
-
- // -- passive display widgets
-
- virtual void addNumDisplay(const char* label, float* zone, int precision)
- {}
- virtual void addTextDisplay(const char* label, float* zone, const char* names[], float min, float max)
- {}
- virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max)
- {}
- virtual void addVerticalBargraph(const char* label, float* zone, float min, float max)
- {}
-
- virtual void show()
- {}
- virtual void run()
- {}
-
- virtual void declare(float* zone, const char* key, const char* value)
- {}
-
-};
-
-
-// global static fields
-
-list<UI*> UI::fGuiList;
-
-/*
-bool GTKUI::fInitialized = false;
-map<float*, float> GTKUI::fGuiSize;
-map<float*, string> GTKUI::fTooltip;
-*/