* qfont.ttf:

* qfont.ttf: Icons

* App.xaml.cs: Set Font String System Wide

* RootPage.xaml.cs:
* QGrid.cs:
* QCueListView.cs:
* qConnectionPage.xaml.cs:
* IPHelper.cs:

* QInstanceCell.cs: Switch to using Icon Font

* QSelectedCueCell.cs: Switch to Type Icon instead of just name

* QClient.cs: Create and dispose of sender for every sent message

* QCue.cs: Add Icon Code method

* ControlPage.xaml: Add hamburger menu

* ControlPage.xaml.cs: Menu for Workspace listing/ cue selection

* MenuPage.xaml.cs: Function to change menu items back for home page
This commit is contained in:
2019-04-18 09:09:19 -05:00
parent 54965a961f
commit 8fd0611a12
15 changed files with 218 additions and 173 deletions
Executable → Regular
BIN
View File
Binary file not shown.
Executable → Regular
BIN
View File
Binary file not shown.
+13
View File
@@ -7,6 +7,7 @@ namespace qController
public static INavigation iNav;
public static NavigationPage NavigationPage { get; private set; }
public static RootPage rootPage;
public static string QFont;
public static bool MenuIsPresented
{
@@ -26,6 +27,18 @@ namespace qController
/*MainPage = new NavigationPage(new QConnectionPage());
iNav = MainPage.Navigation;*/
switch (Device.RuntimePlatform)
{
case Device.iOS:
QFont = "qfont";
break;
case Device.Android:
QFont = "qfont.ttf#qfont";
break;
}
var menuPage = new MenuPage();
rootPage = new RootPage();
NavigationPage = new NavigationPage(new QConnectionPage());
@@ -1,50 +0,0 @@
using System;
using System.Collections.Generic;
using Xamarin.Forms;
namespace qController
{
public class QCueListView : Frame
{
ListView listView;
public QCueListView()
{
Padding = new Thickness(5);
CornerRadius = 20;
BackgroundColor = Color.FromHex("D8D8D8");
Grid mainG = new Grid
{
Padding = new Thickness(0),
RowDefinitions =
{
new RowDefinition{Height = GridLength.Star}
},
ColumnDefinitions =
{
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
}
};
listView = new ListView();
mainG.Children.Add(listView, 0, 0);
Margin = new Thickness(10);
Content = mainG;
}
public void UpdateWithWorkspace(QWorkSpace qWorkspace)
{
List<string> cueLists = new List<string>();
foreach( var cueList in qWorkspace.data )
{
cueLists.Add(cueList.listName);
foreach(var cue in cueList.cues)
{
if(cue.number == "")
cueLists.Add("\t" + cue.listName);
else
cueLists.Add("\t" + cue.number + " - " + cue.listName);
}
}
listView.ItemsSource = cueLists.ToArray();
}
}
}
@@ -11,8 +11,6 @@ namespace qController
Label nameLabel = new Label();
Label addressLabel = new Label();
Image connectButton = new Image();
Image deleteButton = new Image();
Label connectLabel = new Label();
Label deleteLabel = new Label();
@@ -21,12 +19,10 @@ namespace qController
var deleteTapGesture = new TapGestureRecognizer();
connectTapGesture.Tapped += Connect;
connectButton.GestureRecognizers.Add(connectTapGesture);
connectLabel.GestureRecognizers.Add(connectTapGesture);
deleteTapGesture.Tapped += Delete;
deleteButton.GestureRecognizers.Add(deleteTapGesture);
deleteLabel.GestureRecognizers.Add(deleteTapGesture);
InitItems();
@@ -79,15 +75,6 @@ namespace qController
nameLabel.FontAttributes = FontAttributes.Bold;
nameLabel.FontSize = 20;
connectButton.HorizontalOptions = LayoutOptions.CenterAndExpand;
connectButton.VerticalOptions = LayoutOptions.CenterAndExpand;
connectButton.Source = "connect.png";
deleteButton.HorizontalOptions = LayoutOptions.CenterAndExpand;
deleteButton.VerticalOptions = LayoutOptions.CenterAndExpand;
deleteButton.Source = "delete.png";
addressLabel.HorizontalTextAlignment = TextAlignment.Center;
addressLabel.VerticalTextAlignment = TextAlignment.Start;
@@ -103,20 +90,8 @@ namespace qController
deleteLabel.FontSize = 40;
deleteLabel.TextColor = Color.Red;
string qfont = "";
switch (Device.RuntimePlatform)
{
case Device.iOS:
qfont = "qfont";
break;
case Device.Android:
qfont = "qfont.ttf#qfont";
break;
}
connectLabel.FontFamily = qfont;
deleteLabel.FontFamily = qfont;
connectLabel.FontFamily = App.QFont;
deleteLabel.FontFamily = App.QFont;
}
@@ -130,7 +105,7 @@ namespace qController
void Connect(object sender, EventArgs e)
{
App.NavigationPage.Navigation.PushModalAsync(new NavigationPage(new ControlPage(nameLabel.Text,addressLabel.Text)));
App.NavigationPage.Navigation.PushAsync(new ControlPage(nameLabel.Text,addressLabel.Text));
Console.WriteLine("Connect To " + nameLabel.Text + " Pressed");
@@ -9,7 +9,6 @@ namespace qController
Label number;
Label type;
Label notes;
public QSelectedCueCell()
{
Padding = new Thickness(5);
@@ -66,23 +65,29 @@ namespace qController
}
};
number = new Label { Text = "N/A"};
number.FontAttributes = FontAttributes.Bold;
number.FontSize = 30;
number.Margin = new Thickness(5);
number = new Label {
Text = "N/A",
FontAttributes = FontAttributes.Bold,
FontSize = 30,
Margin = new Thickness(5)
};
name = new Label {
Text = "N/A",
FontAttributes = FontAttributes.Bold,
HorizontalTextAlignment = TextAlignment.Center,
FontSize = 20,
Margin = new Thickness(0)
};
name = new Label { Text = "N/A" };
name.FontAttributes = FontAttributes.Bold;
name.HorizontalTextAlignment = TextAlignment.Center;
name.FontSize = 20;
name.Margin = new Thickness(0);
type = new Label { Text = "N/A" };
type.FontAttributes = FontAttributes.Bold;
type.VerticalTextAlignment = TextAlignment.Center;
type.HorizontalTextAlignment = TextAlignment.End;
type.Margin = new Thickness(5);
type = new Label {
Text = "",
FontFamily = App.QFont,
VerticalTextAlignment = TextAlignment.Center,
HorizontalTextAlignment = TextAlignment.End,
Margin = new Thickness(5),
FontSize = 27
};
notes = new Label { Text = "Viewing Notes Currently Unavailable" };
notes.HorizontalTextAlignment = TextAlignment.Center;
@@ -112,7 +117,7 @@ namespace qController
{
name.Text = cue.name;
number.Text = cue.number;
type.Text = cue.type;
type.Text = cue.getIconString();
notes.Text = cue.notes;
}
}
@@ -1,18 +0,0 @@
using System;
using System.Net;
namespace qController
{
public class IPHelper
{
public IPHelper()
{
}
public static bool IsValidAddress(string ipString){
if ((ipString.Split('.').Length - 1) != 3) return false;
IPAddress address;
return IPAddress.TryParse(ipString, out address);
}
}
}
@@ -12,12 +12,16 @@ namespace qController
public QParser qParser;
public QReceiver qReceiver;
string Address;
int Port;
public QClient(string address, int port)
{
Address = address;
Port = port;
qParser = new QParser();
qReceiver = new QReceiver(port + 1);
tcpSender = new TCPSender(address, port);
udpSender = new UDPSender(address, port);
qReceiver = new QReceiver(Port + 1);
tcpSender = new TCPSender(Address, Port);
udpSender = new UDPSender(Address, Port);
tcpSender.MessageReceived += OnMessageReceived;
qReceiver.UpdateMessageReceived += OnMessageReceived;
@@ -44,11 +48,15 @@ namespace qController
}
public void sendStringUDP(string address)
{
udpSender = new UDPSender(Address,Port);
udpSender.Send(new OscMessage(address));
udpSender.Close();
}
public void sendArgsUDP(string address, params object[] args)
{
udpSender = new UDPSender(Address, Port);
udpSender.Send(new OscMessage(address, args));
udpSender.Close();
}
public void sendAndReceiveString(string address)
{
+59
View File
@@ -26,5 +26,64 @@ namespace qController
public string displayName { get; set; }
public bool isLoaded { get; set; }
public string notes { get; set; }
public string getIconString()
{
switch (type)
{
case "Group":
return "\uF248";
case "Audio":
return "\uE807";
case "Mic":
return "\uF130";
case "Video":
return "\uE805";
case "Camera":
return "\uE806";
case "Text":
return "T";
case "Light":
return "\uF0EB";
case "Fade":
return "\uF1DE";
case "Network":
return "\uF192";
case "MIDI":
return "";
case "MIDI File":
return "\uE804";
case "Timecode":
return "\uE808";
case "Start":
return "\uE809";
case "Stop":
return "\uE80A";
case "Pause":
return "\uE80B";
case "Load":
return "\uE80E";
case "Reset":
return "\uE80F";
case "Devamp":
return "\uE80C";
case "GoTo":
return "\uF178";
case "Target":
return "\uE80D";
case "Arm":
return "\uE810";
case "Disarm":
return "";
case "Wait":
return "\uF250";
case "Memo":
return "\uF27B";
case "Script":
return "\uE811";
default:
return "";
}
}
}
}
@@ -1,11 +0,0 @@
using System;
namespace qController
{
public class QGrid
{
public QGrid()
{
}
}
}
+1 -1
View File
@@ -10,7 +10,7 @@
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name = "backButton" HorizontalOptions = "Start" Margin="20,10,20,10" Grid.Row="0" Grid.Column="0" />
<Label x:Name = "menuButton" FontFamily = "{StaticResource qfont}" HorizontalOptions = "Start" Margin="20,10,20,10" Grid.Row="0" Grid.Column="0" FontSize="25"/>
</Grid>
</StackLayout>
</ContentPage.Content>
+32 -19
View File
@@ -11,7 +11,6 @@ namespace qController
Label instanceName = new Label();
QSelectedCueCell qCell;
QSelectedCueOptionsCell qSelectedCueOptions;
QCueListView qCueListView;
Grid mainG;
ListView listView;
public ControlPage(string name, string address)
@@ -23,18 +22,30 @@ namespace qController
qController.qClient.qParser.WorkspaceUpdated += WorkspaceUpdated;
qController.qClient.qParser.PlaybackPositionUpdated += PlaybackPositionUpdated;
qController.qClient.qParser.CueInfoUpdated += OnCueUpdateReceived;
NavigationPage.SetHasNavigationBar(this, false);
instanceName.Text = name;
instanceName.Text = name;
App.rootPage.MenuItemSelected += OnMenuItemSelected;
InitGUI();
}
private void OnMenuItemSelected(object source, MenuEventArgs args)
{
if (args.Command.Contains("/"))
{
Console.WriteLine("Cue selected: " + args.Command);
qController.qClient.sendStringUDP(args.Command);
}else if (args.Command == "disconnect")
{
Back();
}
}
private void InitGUI()
{
NavigationPage.SetHasNavigationBar(this, false);
instanceName.HorizontalTextAlignment = TextAlignment.Center;
instanceName.HorizontalOptions = LayoutOptions.CenterAndExpand;
instanceName.VerticalOptions = LayoutOptions.CenterAndExpand;
@@ -42,11 +53,11 @@ namespace qController
topBar.BackgroundColor = Color.FromHex("71AEFF");
BackgroundColor = Color.FromHex("4A4A4A");
backButton.Source = ImageSource.FromFile("back");
menuButton.Text = "\uF0C9";
switch (Device.RuntimePlatform)
{
case Device.iOS:
backButton.Margin = new Thickness(20, 35, 20, 10);
menuButton.Margin = new Thickness(20, 35, 20, 10);
instanceName.Margin = new Thickness(20, 35, 20, 10);
break;
@@ -61,10 +72,10 @@ namespace qController
buttons.Add(new QButton("Pause", "/pause"));
buttons.Add(new QButton("Resume", "/resume"));
var backButtonGesture = new TapGestureRecognizer();
var menuButtonGesture = new TapGestureRecognizer();
backButtonGesture.Tapped += Back;
backButton.GestureRecognizers.Add(backButtonGesture);
menuButtonGesture.Tapped += ShowMenu;
menuButton.GestureRecognizers.Add(menuButtonGesture);
qCell = new QSelectedCueCell();
@@ -85,7 +96,8 @@ namespace qController
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}
}
},
Margin = new Thickness(10)
};
@@ -121,9 +133,6 @@ namespace qController
sLayout.Children.Add(mainG);
qCueListView = new QCueListView();
//sLayout.Children.Add(qCueListView);
}
@@ -132,11 +141,17 @@ namespace qController
qController.qClient.sendStringUDP(((QButton)sender).OSCCommand);
}
void Back(object sender, EventArgs e)
void ShowMenu(object sender, EventArgs e)
{
App.NavigationPage.Navigation.PopModalAsync();
//App.NavigationPage.Navigation.PopAsync();
App.MenuIsPresented = true;
}
void Back()
{
App.rootPage.MenuPage.ChangeToHome();
App.NavigationPage.Navigation.PopAsync();
}
public void SelectedCueUpdated(object sender, CueEventArgs e){
Device.BeginInvokeOnMainThread(()=>{
if (e.Cue.type.Equals("Audio"))
@@ -157,10 +172,8 @@ namespace qController
{
if(e.UpdatedWorkspace.data.Count > 0)
{
Device.BeginInvokeOnMainThread(() =>
{
qCueListView.UpdateWithWorkspace(e.UpdatedWorkspace);
});
App.rootPage.MenuPage.ChangeToWorkspace(e.UpdatedWorkspace);
qController.qWorkspace = e.UpdatedWorkspace;
Console.WriteLine("Workspace updated in ControlPage: " + qController.qWorkspace.workspace_id);
}
+71 -19
View File
@@ -1,20 +1,21 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace qController
{
public partial class MenuPage : ContentPage
{
public ListView ListView { get { return listView; } }
ListView listView;
public ListView listView;
public ObservableCollection<MasterPageItem> items;
public MenuPage()
{
Title = "Menu";
InitializeComponent();
var items = new List<MasterPageItem>();
items = new ObservableCollection<MasterPageItem>();
items.Add(new MasterPageItem
{
Title = "Scan Network",
@@ -42,33 +43,25 @@ namespace qController
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(30) });
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star });
string qfont = "";
switch (Device.RuntimePlatform)
{
case Device.iOS:
qfont = "qfont";
break;
case Device.Android:
qfont = "qfont.ttf#qfont";
break;
}
var icon = new Label();
icon.FontFamily = qfont as string;
icon.FontFamily = App.QFont;
icon.SetBinding(Label.TextProperty, "Icon");
icon.HorizontalTextAlignment = TextAlignment.Center;
icon.VerticalTextAlignment = TextAlignment.Center;
icon.FontSize = 20;
var label = new Label { VerticalOptions = LayoutOptions.FillAndExpand };
label.SetBinding(Label.TextProperty, "Title");
Console.WriteLine(label.Text);
if (label.Text == "Disconnect")
{
label.TextColor = Color.DarkRed;
}
grid.Children.Add(icon);
grid.Children.Add(label, 1, 0);
return new ViewCell { View = grid };
}),
SeparatorVisibility = SeparatorVisibility.None
})
};
Content = new StackLayout
{
@@ -76,5 +69,64 @@ namespace qController
};
}
public void ChangeToWorkspace(QWorkSpace workspace)
{
items.Clear();
items.Add(new MasterPageItem
{
Title = "Disconnect",
Icon = "\uE803",
Command = "disconnect"
});
foreach (var cueList in workspace.data)
{
items.Add(new MasterPageItem
{
Title = cueList.listName,
Icon = "",
Command = ""
});
foreach (var cue in cueList.cues)
{
var cueIcon = cue.getIconString();
var cueTitle = "";
if(cue.number != "")
{
cueTitle = "\t" + cue.number + " - " + cue.listName;
}
else
{
cueTitle = "\t" + cue.listName;
}
items.Add(new MasterPageItem
{
Title = cueTitle,
Icon = cueIcon,
Command = "/select_id/" + cue.uniqueID
});
}
}
}
public void ChangeToHome()
{
items.Clear();
items.Add(new MasterPageItem
{
Title = "Scan Network",
Icon = "\uE800",
Command = "scan"
});
items.Add(new MasterPageItem
{
Title = "Add Manually",
Icon = "\uE801",
Command = "add"
});
}
}
}
+3 -3
View File
@@ -20,7 +20,7 @@ namespace qController
public partial class RootPage : MasterDetailPage
{
MenuPage MenuPage;
public MenuPage MenuPage;
public delegate void MenuItemSelectedHandler(object source, MenuEventArgs args);
public event MenuItemSelectedHandler MenuItemSelected;
@@ -34,7 +34,7 @@ namespace qController
{
MenuPage = (MenuPage)Master;
MenuPage.ListView.ItemSelected += OnItemSelected;
MenuPage.listView.ItemSelected += OnItemSelected;
}
void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
@@ -42,7 +42,7 @@ namespace qController
var item = e.SelectedItem as MasterPageItem;
if (item != null)
{
MenuPage.ListView.SelectedItem = null;
MenuPage.listView.SelectedItem = null;
IsPresented = false;
if (MenuItemSelected != null)
MenuItemSelected(this, new MenuEventArgs { Command = item.Command });
@@ -20,7 +20,6 @@ namespace qController
private void OnMenuItemSelected(object source, MenuEventArgs args)
{
Console.WriteLine("Menu Item Selected: " + args.Command);
if(args.Command == "scan")
{
Scan();
@@ -63,10 +62,10 @@ namespace qController
lstView.BackgroundColor = Color.FromHex("4A4A4A");
BackgroundColor = Color.FromHex("4A4A4A");
var scanButtonGesture = new TapGestureRecognizer();
var menuButtonGesture = new TapGestureRecognizer();
scanButtonGesture.Tapped += showMenu;
menuButton.GestureRecognizers.Add(scanButtonGesture);
menuButtonGesture.Tapped += showMenu;
menuButton.GestureRecognizers.Add(menuButtonGesture);
}