Changeset 148
- Timestamp:
- 03/08/07 13:57:19 (1 year ago)
- Files:
-
- dmp/trunk/Bridge/Bridge.csproj (modified) (1 diff)
- dmp/trunk/DataObjects/DataObjects.csproj (modified) (1 diff)
- dmp/trunk/client/wpfclient/ControlTemplates.xaml (modified) (1 diff)
- dmp/trunk/client/wpfclient/SongViewer.cs (modified) (12 diffs)
- dmp/trunk/client/wpfclient/icons/Thumbs.db (modified) (previous)
- dmp/trunk/client/wpfclient/main_window.xaml (modified) (1 diff)
- dmp/trunk/client/wpfclient/main_window.xaml.cs (modified) (5 diffs)
- dmp/trunk/client/wpfclient/wpfclient.csproj (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
dmp/trunk/Bridge/Bridge.csproj
r141 r148 1 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">1 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 2 <PropertyGroup> 3 3 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> dmp/trunk/DataObjects/DataObjects.csproj
r87 r148 42 42 </ItemGroup> 43 43 <ItemGroup> 44 <Compile Include="GPair.cs" /> 44 45 <Compile Include="Playlist.cs" /> 45 46 <Compile Include="Track.cs" /> dmp/trunk/client/wpfclient/ControlTemplates.xaml
r132 r148 47 47 </ControlTemplate> 48 48 49 <ControlTemplate x:Key="ServerRemove" TargetType="{x:Type Button}"> 50 <Image Name="Icon" Source="pack://application:,,/resources/ServerRem_nohover.png" Width="18" Height="18"/> 51 <ControlTemplate.Triggers> 52 <Trigger Property="UIElement.IsMouseOver" Value="true"> 53 <Setter TargetName="Icon" Property="Image.Source" Value="pack://application:,,/resources/ServerRem_hover.png"/> 54 </Trigger> 55 </ControlTemplate.Triggers> 56 </ControlTemplate> 57 49 58 </ResourceDictionary> dmp/trunk/client/wpfclient/SongViewer.cs
r132 r148 14 14 public class SongViewer : Control 15 15 { 16 private DataTable songDT = null; 16 Brush ColSortBGColor = Brushes.LightGray; //Background color to be used for the column that is being sorted 17 Brush ColNonSortBGColor = Brushes.White;//Background color for non-sorted columns 18 19 Brush RowMajorColor = Brushes.LightSteelBlue; 20 Brush RowMinorColor = Brushes.White; 21 22 Brush HighlightedRowColor = Brushes.LightGreen; 23 24 private DataTable songDT = new DataTable(); 17 25 public DataTable SongDT { 18 26 get{ return songDT; } 19 27 set{ 20 songDT = value; 21 currentView = songDT.DefaultView; 28 DataView newView = value.DefaultView; 29 newView.Sort = currentView.Sort; 30 newView.RowFilter = currentView.RowFilter; 31 32 songDT = value; 33 currentView = newView; 34 35 UpdateVertScrollSize(); 22 36 InvalidateVisual(); 23 37 } 24 38 } 25 39 26 private DataView currentView = n ull;40 private DataView currentView = new DataView(); 27 41 public DataView CurrentView { 28 42 get { return currentView; } … … 37 51 columns = new LinkedList<string>(); 38 52 iMargin = 2; 39 } 53 54 HighlightedRow.SongId = -1; 55 HighlightedRow.LibId = -1; 56 HighlightedRow.LastIndex = -1; 57 } 58 59 struct RowRecord{ 60 public int SongId; 61 public int LibId; 62 public int LastIndex; 63 } 40 64 41 65 //This represents the first song to be displayed … … 43 67 private int FirstIndex { 44 68 set { 45 firstIndex = value; 46 InvalidateVisual(); 69 if(value==firstIndex) 70 return; 71 72 int newValue; 73 //We need to make sure the new value is valud 74 if(value<0) 75 newValue=0; 76 else if(value >= currentView.Count - visibleRows + 1 ) 77 newValue = currentView.Count - visibleRows + 2; 78 else 79 newValue = value; 80 81 if(newValue != firstIndex){ 82 firstIndex = newValue; 83 vertScrollBar.Value = firstIndex; 84 InvalidateVisual(); 85 } 47 86 } 48 87 get{ return firstIndex; } 49 88 } 89 90 //Last fully drawn index 91 private int LastIndex { 92 get{ 93 return Math.Min(firstIndex+visibleRows-2, currentView.Count-1); 94 } 95 } 50 96 51 97 ScrollBar vertScrollBar; … … 109 155 110 156 //Have to draw a rectangle for header row 111 dc.DrawRectangle(Brushes.White, new Pen(Brushes.White, 0),157 /*dc.DrawRectangle(Brushes.White, new Pen(Brushes.White, 0), 112 158 new Rect(currentPt, new Point(currentPt.X + RenderSize.Width, currentPt.Y + fontHeight))); 113 159 */ 114 160 115 161 //Compute width for each column … … 120 166 while (currentCol != null) 121 167 { 122 DrawCell(currentCol.Value, dc, currentPt, colWidth); 168 Brush bgBrush; 169 if(currentCol.Value == currentSortCol) 170 bgBrush = ColSortBGColor; 171 else 172 bgBrush = ColNonSortBGColor; 173 174 dc.DrawRectangle(bgBrush, new Pen(Brushes.White, 0), 175 new Rect(currentPt, new Point(currentPt.X + colWidth, currentPt.Y + fontHeight))); 176 177 string colName; 178 if(currentCol.Value == currentSortCol){ 179 if(Ascending) 180 colName = currentCol.Value + " [A-Z]"; 181 else 182 colName = currentCol.Value + " [Z-A]"; 183 } 184 else 185 colName = currentCol.Value; 186 187 DrawCell(colName, dc, currentPt, colWidth); 123 188 124 189 currentCol = currentCol.Next; … … 135 200 136 201 Brush currentBrush; 137 if ((int)currentView[i]["id"] == highlightedId) { 138 currentBrush = Brushes.Tomato; 202 203 bool rowHighlighted = ((int)currentView[i]["id"] == HighlightedRow.SongId); 204 if (rowHighlighted) { 205 currentBrush = HighlightedRowColor; 139 206 fontColor = Brushes.White; 207 208 HighlightedRow.LastIndex = i; 140 209 } 141 210 else 142 currentBrush = (i % 2 == 1) ? Brushes.LightSteelBlue : Brushes.White;211 currentBrush = (i % 2 == 1) ? RowMajorColor : RowMinorColor; 143 212 144 213 dc.DrawRectangle(currentBrush, new Pen(Brushes.White, 0), new Rect(currentPt, … … 153 222 currentCol = currentCol.Next; 154 223 } 155 if ( (int)currentView[i]["id"] == highlightedId)224 if (rowHighlighted) 156 225 fontColor = Brushes.Black; 157 226 … … 220 289 //Changes the range of the scrollbars when the number of displayed rows or count changes 221 290 void UpdateVertScrollSize(){ 222 if(SongDT == null || SongDT.Rows.Count < VisibleRows)291 if(SongDT == null || currentView.Count < VisibleRows) 223 292 vertScrollBar.Visibility = Visibility.Hidden; 224 293 else{ 225 294 vertScrollBar.Visibility = Visibility.Visible; 226 vertScrollBar.Maximum = SongDT.Rows.Count - (VisibleRows - 1); 227 vertScrollBar.ViewportSize = VisibleRows-1; 228 } 229 } 230 231 int highlightedIndex = -1; 232 int highlightedId = -1; 233 295 vertScrollBar.Maximum = currentView.Count - (VisibleRows - 1); 296 vertScrollBar.ViewportSize = Math.Max(0, VisibleRows-1); 297 } 298 } 299 300 RowRecord HighlightedRow; 301 234 302 Brush fontColor = Brushes.Black; 235 303 236 304 protected override void OnMouseDown(MouseButtonEventArgs e) 237 305 { 306 Focus(); 307 238 308 switch (e.ChangedButton) 239 309 { … … 249 319 if (e.ClickCount == 2) 250 320 MessageBox.Show("Doubleclick occured"); 251 highlightedIndex = rowClicked - 1; 252 highlightedId = (int)currentView[highlightedIndex]["id"]; 321 322 HighlightedRow.LastIndex = rowClicked -1; 323 HighlightedRow.SongId = (int)currentView[HighlightedRow.LastIndex]["id"]; 324 253 325 InvalidateVisual(); 254 326 } … … 281 353 } 282 354 355 string currentSortCol = null; 356 bool Ascending = true; 357 283 358 void SortOnColName(string colName) 284 359 { 285 if (CurrentView.Sort == colName) 286 CurrentView.Sort = colName + " DESC"; 287 else 288 currentView.Sort = colName; 289 290 InvalidateVisual(); 291 } 360 if(colName == currentSortCol){ 361 if(Ascending){ 362 currentView.Sort = colName + " DESC"; 363 Ascending = false; 364 } 365 else { 366 currentView.Sort = colName; 367 Ascending = true; 368 } 369 } 370 else { 371 currentView.Sort = colName; 372 currentSortCol = colName; 373 Ascending = true; 374 } 375 376 InvalidateVisual(); 377 } 292 378 293 379 TextBox searchBox; … … 301 387 } 302 388 389 //Sets the filter option for real-time searching 303 390 void OnSearchBoxUpdate(Object sender, TextChangedEventArgs args) 304 391 { … … 306 393 307 394 CurrentView.RowFilter = "Artist LIKE '*"+currentSearch+"*' OR Album LIKE '*"+currentSearch+"*' OR Title LIKE '*"+currentSearch+"*'"; 308 InvalidateVisual(); 309 } 395 UpdateVertScrollSize(); 396 InvalidateVisual(); 397 } 398 399 protected override void OnKeyDown(KeyEventArgs e) 400 { 401 Focus(); 402 403 switch(e.Key){ 404 case Key.Up : 405 MoveHighlight(-1); 406 //MessageBox.Show("asdf"); 407 break; 408 case Key.Down: 409 MoveHighlight(1); 410 break; 411 default: 412 //base.OnKeyDown(e); 413 break; 414 } 415 e.Handled = true; 416 } 417 418 protected override void OnKeyUp(KeyEventArgs e) 419 { 420 //base.OnKeyUp(e); 421 } 422 423 protected override void OnMouseWheel(MouseWheelEventArgs e) 424 { 425 int lineDelta = 2*Math.Sign(e.Delta); 426 FirstIndex -= lineDelta; 427 } 428 429 //Returns the value that's in the middle 430 int MidRange(int p1, int p2, int p3){ 431 int max = Math.Max(Math.Max(p1, p2), p3); 432 int min = Math.Min(Math.Min(p1, p2), p3); 433 434 if(p1 != max && p1 != min) 435 return p1; 436 437 if(p2 != max && p2 != min) 438 return p2; 439 440 return p3; 441 } 442 443 //This changes the currently highlighted song 444 void MoveHighlight(int amount){ 445 //First make sure the currently highlighted song is even displayed 446 if((int)currentView[HighlightedRow.LastIndex]["id"] != HighlightedRow.SongId) 447 return; 448 449 int newIndex = HighlightedRow.LastIndex + amount; 450 //Make sure the new index is valid 451 if(newIndex<0 || newIndex >= currentView.Count) 452 return; 453 454 HighlightedRow.LastIndex = newIndex; 455 HighlightedRow.SongId = (int)currentView[newIndex]["id"]; 456 457 if(newIndex < FirstIndex){ 458 FirstIndex = newIndex; 459 } 460 else if(newIndex > LastIndex){ 461 FirstIndex++; 462 } 463 464 InvalidateVisual(); 465 } 310 466 } 311 467 } dmp/trunk/client/wpfclient/main_window.xaml
r132 r148 35 35 <TextBox Width="60" Height="20" Margin="5" Name="SearchBox" Grid.Row="0" Grid.Column="2"/> 36 36 37 <!--StackPanel Grid.Row="1" Grid.Column="0" Margin="5">38 <Expander IsExpanded="True" Header="Servers">39 <StackPanel Name="serverStack"/>40 </Expander>41 </StackPanel-->42 37 <StackPanel Name="serverStack" Grid.Row="1" Grid.Column="0" Margin="5"> 43 38 <!--StackPanel Orientation="Horizontal"> dmp/trunk/client/wpfclient/main_window.xaml.cs
r139 r148 36 36 37 37 songViewBorder.Child = songView; 38 songView.Focusable = true; 38 39 39 40 myBridge = new Bridge(); 40 myBridge.myServiceLocator.Found += serverFound; 41 myBridge.myServiceLocator.Removed += serverRemoved; 41 42 myBridge.ServerAdded += serverAdded; 43 myBridge.ServerRemoved += serverRemoved; 42 44 myBridge.StartZeroConf(); 43 45 … … 56 58 delegate void ServerUpdateDelegate(); 57 59 58 Queue<DAAP.Service> newServers = new Queue<DAAP.Service>(); 59 private void serverFound(object o, DAAP.ServiceArgs args){ 60 //Queue to store arguments that can be passed across threads, string is servername, bool connection status 61 Queue<GPair<string, bool>> newServers = new Queue<GPair<string, bool>>(); 62 private void serverAdded(object o, ServerStatusEventArgs args){ 60 63 lock(newServers){ 61 newServers.Enqueue(args.Service); 62 } 63 64 serverStack.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new ServerUpdateDelegate(addServer)); 64 newServers.Enqueue(new GPair<string, bool>(args.ServerName, args.ServerIsConnected)); 65 } 66 67 serverStack.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, 68 new ServerUpdateDelegate(addServer)); 65 69 } 66 70 … … 70 74 void addServer() 71 75 { 72 DAAP.Serviceserver;76 GPair<string, bool> server; 73 77 lock (newServers) 74 78 { … … 76 80 } 77 81 78 StackPanel newButton = CreateServerButton(server. Name);79 displayedServers.Add(server. Name, newButton);82 StackPanel newButton = CreateServerButton(server.First, server.Second); 83 displayedServers.Add(server.First, newButton); 80 84 serverStack.Children.Add(newButton); 81 85 } 82 86 83 Queue< DAAP.Service> removedServers = new Queue<DAAP.Service>();84 void serverRemoved(object o, DAAP.ServiceArgs args){87 Queue<string> removedServers = new Queue<string>(); 88 void serverRemoved(object o, ServerStatusEventArgs args){ 85 89 lock(removedServers){ 86 removedServers.Enqueue(args.Service); 87 } 88 serverStack.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new ServerUpdateDelegate(removeServer)); 90 removedServers.Enqueue(args.ServerName); 91 } 92 serverStack.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, 93 new ServerUpdateDelegate(removeServer)); 89 94 } 90 95 91 96 void removeServer() 92 97 { 93 DAAP.Service service;98 string serverName; 94 99 lock(removedServers){ 95 serv ice = removedServers.Dequeue();96 } 97 98 serverStack.Children.Remove(displayedServers[serv ice.Name]);99 displayedServers.Remove(serv ice.Name);100 } 101 102 private StackPanel CreateServerButton(string serverName ) {100 serverName = removedServers.Dequeue(); 101 } 102 103 serverStack.Children.Remove(displayedServers[serverName]); 104 displayedServers.Remove(serverName); 105 } 106 107 private StackPanel CreateServerButton(string serverName, bool connected) { 103 108 StackPanel mainPanel = new StackPanel(); 104 109 mainPanel.Orientation = Orientation.Horizontal; 105 110 106 111 BitmapImage bitmap = new BitmapImage(); 107 bitmap.BeginInit(); 108 bitmap.UriSource = new Uri("pack://application:,,/resources/Server_red.png");112 bitmap.BeginInit(); 113 bitmap.UriSource = GetServerStatus(connected); 109 114 bitmap.EndInit(); 110 115 … … 118 123 mainPanel.Children.Add(serverText); 119 124 120 Button addButton = new Button(); 121 addButton.Template = (ControlTemplate)this.FindResource("ServerAdd"); 122 mainPanel.Children.Add(addButton); 125 Button controlButton = new Button(); 126 controlButton.Template = GetButtonTemplate(connected); 127 controlButton.PreviewMouseLeftButtonDown += OnServerAdd; 128 controlButton.Content = serverName; 129 mainPanel.Children.Add(controlButton); 123 130 124 131 return mainPanel; 125 132 } 126 133 134 private Uri GetServerStatus(bool connected){ 135 if(connected) 136 return new Uri("pack://application:,,/resources/Server_green.png"); 137 else 138 return new Uri("pack://application:,,/resources/Server_red.png"); 139 } 140 141 private ControlTemplate GetButtonTemplate(bool connected){ 142 if(connected) 143 return (ControlTemplate)FindResource("ServerRemove"); 144 else 145 return (ControlTemplate)FindResource("ServerAdd"); 146 } 147 148 Queue<GPair<string, bool>> statusQueue = new Queue<GPair<string, bool>>(); 149 private void ServerStatusChanged(string serverName, bool connected){ 150 lock(statusQueue){ 151 statusQueue.Enqueue(new GPair<string, bool>(serverName, connected)); 152 } 153 154 serverStack.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, 155 new ServerUpdateDelegate(ChangeServerStatus)); 156 } 157 158 //Will change a server button status to connected or disconnected regardless of earlier state 159 void ChangeServerStatus() { 160 GPair<string, bool> server; 161 lock(statusQueue){ 162 server = statusQueue.Dequeue(); 163 } 164 165 StackPanel mainPanel = displayedServers[server.First]; 166 BitmapImage bitmap = (BitmapImage)((Image)mainPanel.Children[0]).Source; 167 168 bitmap.BeginInit(); 169 bitmap.UriSource = GetServerStatus(server.Second); 170 bitmap.EndInit(); 171 172 Button controlButton = (Button)mainPanel.Children[2]; 173 controlButton.Template = GetButtonTemplate(server.Second); 174 } 175 176 Queue<DataTable> datatableQueue = new Queue<DataTable>(); 177 private void DataTableChanged(object o, SongListChangedEventArgs args){ 178 lock(datatableQueue){ 179 datatableQueue.Enqueue(args.NewTable); 180 } 181 182 serverStack.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, 183 new ServerUpdateDelegate(ChangeDataTable)); 184 } 185 186 void ChangeDataTable(){ 187 DataTable newDT; 188 lock(datatableQueue){ 189 newDT = datatableQueue.Dequeue(); 190 } 191 192 songView.SongDT = newDT; 193 } 194 195 private void OnServerAdd(object sender, MouseButtonEventArgs args){ 196 Button source = (Button)sender; 197 MessageBox.Show("Server "+(string)source.Content+" added!"); 198 } 199 200 //Populates a datatable with dummy data for testing purposes 127 201 private DataTable createTestTable() 128 202 { dmp/trunk/client/wpfclient/wpfclient.csproj
r130 r148 41 41 </ItemGroup> 42 42 <ItemGroup> 43 <Compile Include="GPair.cs" /> 43 44 <Compile Include="main_window.xaml.cs"> 44 45 <SubType>Code</SubType> … … 78 79 <Resource Include="resources\ServerAdd_nohover.png" /> 79 80 </ItemGroup> 81 <ItemGroup> 82 <Resource Include="resources\ServerRem_hover.png" /> 83 <Resource Include="resources\ServerRem_nohover.png" /> 84 <Resource Include="resources\Server_green.png" /> 85 </ItemGroup> 80 86 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 81 87 <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />
