diff --git a/BatteryWidget/WidgetForm.Designer.cs b/BatteryWidget/WidgetForm.Designer.cs index b947a34..f016ad5 100644 --- a/BatteryWidget/WidgetForm.Designer.cs +++ b/BatteryWidget/WidgetForm.Designer.cs @@ -1,5 +1,7 @@ namespace BatteryWidget { - partial class WidgetForm { + + partial class WidgetForm + { /// /// Required designer variable. /// @@ -9,8 +11,10 @@ /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { components.Dispose(); } base.Dispose(disposing); @@ -22,13 +26,108 @@ /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// - private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); + private void InitializeComponent() + { + this.mainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.titleLabel = new System.Windows.Forms.Label(); + this.exitLabel = new System.Windows.Forms.Label(); + this.contentPanel = new System.Windows.Forms.Panel(); + this.imageLabel = new System.Windows.Forms.Label(); + this.mainTableLayoutPanel.SuspendLayout(); + this.contentPanel.SuspendLayout(); + this.SuspendLayout(); + // + // mainTableLayoutPanel + // + this.mainTableLayoutPanel.ColumnCount = 2; + this.mainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.mainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 14F)); + this.mainTableLayoutPanel.Controls.Add(this.titleLabel, 0, 0); + this.mainTableLayoutPanel.Controls.Add(this.exitLabel, 1, 0); + this.mainTableLayoutPanel.Controls.Add(this.contentPanel, 0, 1); + this.mainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.mainTableLayoutPanel.Location = new System.Drawing.Point(0, 0); + this.mainTableLayoutPanel.Name = "mainTableLayoutPanel"; + this.mainTableLayoutPanel.RowCount = 2; + this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 12F)); + this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.mainTableLayoutPanel.Size = new System.Drawing.Size(120, 69); + this.mainTableLayoutPanel.TabIndex = 0; + // + // titleLabel + // + this.titleLabel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.titleLabel.Dock = System.Windows.Forms.DockStyle.Fill; + this.titleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.titleLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.titleLabel.Location = new System.Drawing.Point(0, 0); + this.titleLabel.Margin = new System.Windows.Forms.Padding(0); + this.titleLabel.Name = "titleLabel"; + this.titleLabel.Size = new System.Drawing.Size(106, 12); + this.titleLabel.TabIndex = 0; + this.titleLabel.Text = "Android Battery Widget"; + this.titleLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // exitLabel + // + this.exitLabel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(196)))), ((int)(((byte)(2)))), ((int)(((byte)(2))))); + this.exitLabel.Dock = System.Windows.Forms.DockStyle.Fill; + this.exitLabel.Image = global::BatteryWidget.Properties.Resources.close; + this.exitLabel.Location = new System.Drawing.Point(107, 0); + this.exitLabel.Margin = new System.Windows.Forms.Padding(1, 0, 1, 0); + this.exitLabel.Name = "exitLabel"; + this.exitLabel.Size = new System.Drawing.Size(12, 12); + this.exitLabel.TabIndex = 1; + // + // contentPanel + // + this.contentPanel.Controls.Add(this.imageLabel); + this.contentPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.contentPanel.Location = new System.Drawing.Point(0, 12); + this.contentPanel.Margin = new System.Windows.Forms.Padding(0); + this.contentPanel.Name = "contentPanel"; + this.contentPanel.Size = new System.Drawing.Size(106, 57); + this.contentPanel.TabIndex = 2; + // + // imageLabel + // + this.imageLabel.BackColor = System.Drawing.Color.DarkGreen; + this.imageLabel.Dock = System.Windows.Forms.DockStyle.Fill; + this.imageLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.imageLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224))))); + this.imageLabel.Image = global::BatteryWidget.Properties.Resources.green; + this.imageLabel.Location = new System.Drawing.Point(0, 0); + this.imageLabel.Margin = new System.Windows.Forms.Padding(0); + this.imageLabel.Name = "imageLabel"; + this.imageLabel.Size = new System.Drawing.Size(106, 57); + this.imageLabel.TabIndex = 0; + this.imageLabel.Text = "99%"; + this.imageLabel.TextAlign = System.Drawing.ContentAlignment.BottomRight; + // + // WidgetForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Text = "Form1"; + this.BackColor = System.Drawing.Color.Fuchsia; + this.ClientSize = new System.Drawing.Size(120, 69); + this.Controls.Add(this.mainTableLayoutPanel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "WidgetForm"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.Text = "Android Battery Widget"; + this.mainTableLayoutPanel.ResumeLayout(false); + this.contentPanel.ResumeLayout(false); + this.ResumeLayout(false); + } #endregion + + private System.Windows.Forms.TableLayoutPanel mainTableLayoutPanel; + private System.Windows.Forms.Label titleLabel; + private System.Windows.Forms.Label exitLabel; + private System.Windows.Forms.Panel contentPanel; + private System.Windows.Forms.Label imageLabel; } } - diff --git a/BatteryWidget/WidgetForm.cs b/BatteryWidget/WidgetForm.cs index b6f7b52..c8d2732 100644 --- a/BatteryWidget/WidgetForm.cs +++ b/BatteryWidget/WidgetForm.cs @@ -1,15 +1,190 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; using System.Drawing; -using System.Text; using System.Windows.Forms; +using BatteryWidget.Properties; namespace BatteryWidget { + public partial class WidgetForm : Form { + + private const int HIDE_CONTROLS_INTERVAL = 1000; + private const int UPDATE_INFO_INTERVAL = 60 * 1000; + + /** Contol moving window */ + private bool windowDragStatus; + private Point clickPoint; + + private Timer updateInfoTimer; + private Timer hideControlsTimer; + + private Image grayImage; + + private BatteryGraph graph; + + + #region Initialize public WidgetForm() { InitializeComponent(); + + imageLabel.Image = ImageLoader.getImage(ImageLoader.ImageName.Green); + grayImage = ImageLoader.getImage(ImageLoader.ImageName.Gray); + + graph = new BatteryGraph(); + + initTimers(); + initWindow(); + initMouseEventHandler(); + + updateInfo(); } + + private void initTimers() { + // Timer for hide window's title + hideControlsTimer = new Timer(); + hideControlsTimer.Interval = HIDE_CONTROLS_INTERVAL; + hideControlsTimer.Tick += (s1, e1) => { + hideControlsTimer.Stop(); + titleLabel.Hide(); + exitLabel.Hide(); + }; + + // Timer for update info + updateInfoTimer = new Timer(); + updateInfoTimer.Interval = UPDATE_INFO_INTERVAL; + updateInfoTimer.Tick += (s, e) => updateInfo(); + updateInfoTimer.Start(); + } + + private void initWindow() { + this.TransparencyKey = this.BackColor; + this.ShowInTaskbar = false; + + // Hide controls + titleLabel.Hide(); + exitLabel.Hide(); + + // Restore window position + this.Location = Settings.Default.windowPosition; + } + + private void initMouseEventHandler() { + // Moving window by title + titleLabel.MouseDown += (s, e) => { + if (e.Button == MouseButtons.Left) { + // Moving mode + windowDragStatus = true; + clickPoint = new Point(e.X, e.Y); + } else { + windowDragStatus = false; + } + }; + titleLabel.MouseMove += (s, e) => { + if (windowDragStatus) { + Point pointMoveTo = this.PointToScreen(new Point(e.X, e.Y)); + pointMoveTo.Offset(-clickPoint.X, -clickPoint.Y); + this.Location = pointMoveTo; + } + }; + titleLabel.MouseUp += (s, e) => { + windowDragStatus = false; + Settings.Default.windowPosition = this.Location; + Settings.Default.Save(); + }; + + // Exit button + exitLabel.MouseClick += (s, e) => this.Close(); + + // Show/hide title and exit button + imageLabel.MouseEnter += (s, e) => { + // Show controls + titleLabel.Show(); + exitLabel.Show(); + hideControlsTimer.Stop(); + }; + imageLabel.MouseLeave += (s, e) => { + // Hide controls + hideControlsTimer.Start(); + }; + imageLabel.MouseClick += (s, e) => { + // Change view by click: graph/image + graph.revertShowState(); + updateInfo(); + }; + } + #endregion + + private void updateInfo() { + int percent = Battery.getBatteryPercentage(); + graph.addPercent(percent); + + // Display graph + if (graph.graphIsShowing()) { + Bitmap bmp = new Bitmap(Size.Width, Size.Height); + Graphics g = Graphics.FromImage(bmp); + graph.drawGraph(g); + g.Dispose(); + + imageLabel.Text = ""; + imageLabel.Image = bmp; + return; + } + + imageLabel.Text = percent + "%"; + imageLabel.Image = makeImage(percent); + } + + #region Images + private Image makeImage(int percent) { + if (percent <= 8) { + return warningStateImage(); + } + + updateInfoTimer.Interval = UPDATE_INFO_INTERVAL; + + if (Battery.isBatteryPowerOn()) { + return powerStateImage(); + } + + return normalStateImage(percent); + } + + private Image powerStateImage() { + imageLabel.BackColor = Color.Black; + return ImageLoader.getImage(ImageLoader.ImageName.Power); + } + + private Image normalStateImage(int percent) { + imageLabel.BackColor = Color.DarkGreen; + + Bitmap bmp = new Bitmap(selectImage(percent)); + + int y = (100 - percent) * bmp.Height / 100; + Rectangle destRect = new Rectangle(0, 0, bmp.Width, y); + + Graphics g = Graphics.FromImage(bmp); + g.DrawImageUnscaledAndClipped(grayImage, destRect); + g.Dispose(); + + return bmp; + } + + private Image warningStateImage() { + updateInfoTimer.Interval = 800; + if (imageLabel.Image.Equals(grayImage)) { + imageLabel.BackColor = Color.DarkGreen; + return ImageLoader.getImage(ImageLoader.ImageName.Red); + } + imageLabel.BackColor = Color.Red; + return grayImage; + } + + private Image selectImage(int percent) { + if (percent < 30) + return ImageLoader.getImage(ImageLoader.ImageName.Red); + else if (percent < 70) + return ImageLoader.getImage(ImageLoader.ImageName.Yellow); + return ImageLoader.getImage(ImageLoader.ImageName.Green); + } + #endregion } -} +} \ No newline at end of file